首先,需要明确 Python 中 logging 模块的基本使用方法和概念。
1. logging 模块
logging 是 Python 提供的一个标准库,用于进行日志记录。可以将日志记录到文件中或者发送到网络中。使用 logging 模块可以:
- 控制输出日志的级别(DEBUG, INFO, WARNING, ERROR, CRITICAL);
- 将不同级别的日志记录到不同的文件中;
- 将日志发送到邮件或者其他外部设备。
以下是一个简单的 logging 实例:
import logging
logging.basicConfig(filename='example.log', level=logging.INFO)
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
上面的代码会生成一个名为 example.log 的日志文件,并且记录下了 5 条不同级别的日志信息。其中,logging.basicConfig 函数用于配置 logging,它可以设定输出的日志级别、输出的日志格式以及日志输出的位置等信息。
2. 多线程输出到同一个日志文件
如果我们在多线程程序中使用 logging 模块,可能会出现多个线程同时写入同一份日志文件的情况,导致日志记录混乱。因此,需要使用线程锁来保证日志记录的线程安全。
以下是一个多线程写入同一份日志文件的实例代码:
import logging
import threading
logging.basicConfig(filename='example.log', level=logging.INFO)
def worker():
for i in range(10):
logging.info(f'Thread {threading.current_thread().name}:{i}')
if __name__ == '__main__':
threads = []
for i in range(3):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
上面的代码开启了 3 个线程并行执行 worker 函数,每个线程会写入 10 条日志信息,同时写入到同一份日志文件 example.log 中。线程并发执行的时候,可能会出现多个线程同时写入同一条日志信息的情况,因此需要用线程锁来保证每个线程写入时都能安全地访问日志文件。可以使用 threading.Lock() 创建一个线程锁,并在写入日志信息之前获取锁。
以下是上面代码的改进版,使用了线程锁来保证日志记录的线程安全:
import logging
import threading
logging.basicConfig(filename='example.log', level=logging.INFO)
lock = threading.Lock()
def worker():
for i in range(10):
with lock:
logging.info(f'Thread {threading.current_thread().name}:{i}')
if __name__ == '__main__':
threads = []
for i in range(3):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
3. 多进程输出到同一个日志文件
如果我们在多进程程序中使用 logging 模块,同样会出现多个进程同时写入同一份日志文件的情况。解决这个问题的方法类似于多线程写入同一份日志文件,需要使用进程锁来保证日志记录的进程安全。
以下是一个多进程写入同一份日志文件的实例代码:
import logging
import multiprocessing
logging.basicConfig(filename='example.log', level=logging.INFO)
def worker():
for i in range(10):
logging.info(f'Process {multiprocessing.current_process().name}:{i}')
if __name__ == '__main__':
processes = []
for i in range(2):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
上面的代码开启了 2 个进程并行执行 worker 函数,每个进程会写入 10 条日志信息,同时将这些信息写入到同一份日志文件 example.log 中。因为多个进程同时写入同一份文件可能会导致写入冲突,因此需要使用进程锁进行同步。
以下是上面代码的改进版,使用了进程锁来保证日志记录的进程安全:
import logging
import multiprocessing
logging.basicConfig(filename='example.log', level=logging.INFO)
lock = multiprocessing.Lock()
def worker():
for i in range(10):
with lock:
logging.info(f'Process {multiprocessing.current_process().name}:{i}')
if __name__ == '__main__':
processes = []
for i in range(2):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
上面的代码在写入日志信息前获取进程锁,并在写入完成后释放锁。这样可以避免多个进程同时写入同一条日志信息的情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python logging多进程多线程输出到同一个日志文件的实战案例 - Python技术站