首先python的日誌模塊是線程安全的,但是不是進程安全的,但是多線程的python對於提升性能來說並沒有什麼用處,所以就會有個挺奇葩的問題,那就是寫程序記錄日誌時出現錯亂。
這個問題我看了很多帖子,很多種解決辦法,但是說實話都比較麻煩,這裏提供一種比較簡單但是也比較奇葩的解決辦法:
把日誌模塊寫成函數。
比如:
def start_log(strPQL):
logger = logging.getLogger()
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
print os.getcwd()
log_path = os.getcwd() + '\\Logs\\'
if not os.path.exists(log_path):
os.mkdir(log_path)
log_name = log_path + rq + strPQL + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w+')
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(fh)
return logger
進入進程中再調用這個函數,然後傳入一個字符串,主要是區分這個日誌文件的,每個進程最好傳入不同的字符串。
這樣的話每個進程都有自己獨立的logger模塊,每個logger模塊都有自己獨立的日誌文件,彼此都是獨立,自然不用擔心異步的問題。