質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1778閲覧

[Python]apache_logの例外対処について

Alan

総合スコア7

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/06/24 03:37

編集2015/06/29 04:51

参考HP

こちらのソースコードを参考にapacheのlogをDBに保存しようとしたのですが、ログでbytesの部分が"-"になっている時に下記のエラーが出てきてしまいます。どうしたらいいですか?

ValueError: invalid literal for int() with base 10: '-'

lang

1#coding:utf8 2 3from sqlobject import * 4import sys,csv, sqlite3, datetime 5 6logname = "short_access_log" 7 8class ApacheDialect(csv.Dialect): 9 delimiter = " " 10 doublequote = True 11 lineterminator="\r\n" 12 quotechar='"' 13 quoting=0 14 skipinitialspace=False 15 16class ApacheLog(SQLObject): 17 ip = StringCol() 18 remotelog = StringCol() 19 remoteuser= StringCol() 20 time = DateTimeCol() 21 request = StringCol() 22 status = IntCol() 23 bytes = IntCol() 24 referer = StringCol() 25 ua = StringCol() 26 27 def _set_time(self,timestr): 28 self._SO_set_time( datetime.datetime.strptime(timestr,"[%d/%b/%Y:%H:%M:%S") ) 29 30if __name__ == '__main__': 31 32 sqlhub.processConnection = connectionForURI('sqlite:///tmp/abc.db') 33 ApacheLog.createTable(ifNotExists=True) 34 35 csv.register_dialect("apache",ApacheDialect) 36 reader = csv.reader(open(logname),dialect="apache") 37 38 for r in reader: 39 ApacheLog( 40 ip = r[0], 41 remotelog = r[1], 42 remoteuser= r[2], 43 time = r[3], 44 #tz = r[4], 45 request = r[5], 46 status = int(r[6]), 47 bytes = int(r[7]), 48 referer = r[8], 49 ua = r[9] 50 ) 51

この場合のエラーメッセージは

Traceback (most recent call last):

File "log2db.py", line 46, in <module>
bytes = int(r[7]),
ValueError: invalid literal for int() with base 10: '-'

です。
参考HP変更しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Pythonには詳しくないですが、そこまで分かっていれば、
bytesがハイフンの場合にどうするかを決めて、
対応するコードを追加すれば良いのではと思います。
例えば、以下の内容です。

  1. bytesを0にするのであれば、if文で分岐するコードを追加する。
  2. その行を読み飛ばすのであれば、try文で例外処理するコードを追加する。

追記

2.例外処理の例

lang

1#coding:utf8 2L = [ '1', '-', '3' ] 3for x in L : 4 try: 5 print int(x) 6 except ValueError, inst : 7 print inst

2.例外処理の、実際のコードの例

lang

1 for r in reader: 2 try: 3 ApacheLog( 4 ip = r[0], 5 remotelog = r[1], 6 remoteuser= r[2], 7 time = r[3], 8 #tz = r[4], 9 request = r[5], 10 status = int(r[6]), 11 bytes = int(r[7]), 12 referer = r[8], 13 ua = r[9] 14 ) 15 except ValueError, inst : 16 print inst

投稿2015/06/24 13:36

編集2015/06/29 06:10
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alan

2015/06/24 23:25

回答有難うございます。自分も例外処理で試していたのですがやり方が違うのか上手くいかなくて悩んでいました。具体的にどうしたらいいか知っていたら教えて欲しいです。
eripong

2015/06/25 12:19 編集

ちょっとそちらで試されているコードを実行できる環境にいないのですが、 回答に追記した様なイメージでできないでしょうか? 今、そちらで動かない状態のコードをここに貼り付けてもらえれば、 どこが間違っているか分かるかもしれません。
Alan

2015/06/29 04:52

すみません、遅くなりました。現在のコードとエラーメッセージ・参考HPを更新しました。
eripong

2015/06/29 06:13

更新してもらったコードでは、例外処理しようとしている部分が分かりませんが、 こちらで考えている修正例を追記しました。 実行した訳ではないので、インデントがおかしいかもしれません。
guest

0

別解ですが、ApacheのログをありのままにDBに格納したいのであれば、
無理にintに変換しなくともstrで良いのでは無いでしょうか?
※もしint変換しなくてはならない理由があるのであれば、変換すべきかと思います。

  1. bytes=の所をStringCol()に変えて

python

1class ApacheLog(SQLObject): 2 ip = StringCol() 3 remotelog = StringCol() 4 remoteuser= StringCol() 5 time = DateTimeCol() 6 request = StringCol() 7 status = IntCol() 8 bytes = StringCol() 9 referer = StringCol() 10 ua = StringCol()
  1. int(r[7])の所を単にr[7]に変える

python

1 for r in reader: 2 ApacheLog( 3 ip = r[0], 4 remotelog = r[1], 5 remoteuser= r[2], 6 time = r[3], 7 #tz = r[4], 8 request = r[5], 9 status = int(r[6]), 10 bytes = r[7], 11 referer = r[8], 12 ua = r[9] 13 )

後は、bytesに対応するDBカラムもVARCHAR型等に変換すれば良いかと思います。

投稿2015/07/26 09:01

編集2015/07/26 09:03
panda_bk

総合スコア99

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問