Djangoにデバッグログ出力機能をつける
Djangoは"本気"なのだろうか。
例えば、Djangoを本気でビジネスユースで利用しようとすると、致命的に足りない物がいくつかある。
1つは日本語入力。
「このフィールドは日本語のみ」「このフィールドはひらがなのみ」「このフィールドはカタカナのみ」がない。
ようは、標準のDjangoのFormField系ではこれらが制限不可能なので、韓国語だろうがタガログだろうが
受け付けられるものは全部受け付けてしまう。
これについては仕方ない。Djangoは海外で生まれた物だし。
しかし、これもフレームワークの仕事であるが故に、誰かContribを!と思ったこともある。
が、自分で作った物をOSSにする、それすなわち「誰かに見られたら恥ずかしいし・・・」となる。
なので、苦労を知る上でも自分で作ってみることも勉強の一環だと思う。
ただ、「何でコレがねーんだよ!」の2つめとしてロギング機能。
ビジネスユースで利用するとして、この機能がないと、O/Rマッパーがバグってた場合や、
View中で何らかの特殊な動作をさせてたと仮定し、エラーになったらログに残せない。メールは飛ぶけど。
それじゃだーめなんだよ!
ということで、こういう風にした。
settings.py中で
def PREPARE_LOG_HANDLE():
num = 0
def PREPARE_LOG_HANDLE():
num = 0
try:
fh = open("./.debug.lock", 'r+')
except:
print "./.debug.lockが開けない!!"
raise IOError('Cant open file("./.debug.lock)')
num = fh.readline(1)
fh.close
if num == '1':
fh = open("./.debug.lock", 'w')
fh.write("2")
fh.close()else:
fh = open("./.debug.lock", 'w')
fh.write("1")
fh.close()
returnprint "Make Debugging Handle"
LOG_DIR = "./"
LOG_NAME = "test.log"
# Access time, filename/function#line-number message
log_formatter = logging.Formatter("[%(asctime)s ] %(message)s")
# This should roll logs over at midnight and date-stamp them appropriately
handler = logging.handlers.TimedRotatingFileHandler(filename = "%s/%s" % (LOG_DIR, LOG_NAME), when='D', interval=1)
handler.setFormatter(log_formatter)
log = logging.getLogger('')
log.setLevel(logging.DEBUG)
log.addHandler(handler)
return logLOGGER = PREPARE_LOG_HANDLE()
これで、Viewsとかあらゆる場所で from django.conf import settingsしたあとに
settings.LOGGER.debug("死ねばいいのに")<<<
とやると、./test.logにログを残せるようになるよ