我是Python新手,刚开始一个项目。我习惯在Java中使用log4j
,我想像在Java中一样记录Python中的所有模块和类。
在Java中,我在src文件夹中有一个名为log4j.properties
的日志配置文件,如下所示:
log4j.rootLogger=DEBUG, Console, fileout
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %5p [%t] (%F:%L) - %m%n
log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=servidor.log
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} (%F:%L) %p %t %c - %m%n
它会记录到控制台和文件。
在我的课程中,我只需要导入log4j
并添加一个静态属性来恢复log4j
记录器并加载配置,然后所有类都将登录到控制台和文件中。配置文件由名称自动加载。例如:
import org.apache.log4j.Logger;
public class Main {
public static Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.info("Hello");
}
}
现在我遇到了在Python中设置日志记录的问题,我已经阅读了文档,但我找不到在许多模块/类中使用它的方法。我怎样才能以简单的方式设置Python日志记录,以便在每个模块/类中没有代码的情况下记录我的模块和类?是否有可能重现我用Python编写的相同代码?
答案 0 :(得分:36)
实际上在Python中它看起来非常相似。有不同的方法来做到这一点。我通常创建一个非常简单的记录器类:
import os
import logging
import settings # alternativly from whereever import settings
class Logger(object):
def __init__(self, name):
name = name.replace('.log','')
logger = logging.getLogger('log_namespace.%s' % name) # log_namespace can be replaced with your namespace
logger.setLevel(logging.DEBUG)
if not logger.handlers:
file_name = os.path.join(settings.LOGGING_DIR, '%s.log' % name) # usually I keep the LOGGING_DIR defined in some global settings file
handler = logging.FileHandler(file_name)
formatter = logging.Formatter('%(asctime)s %(levelname)s:%(name)s %(message)s')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
self._logger = logger
def get(self):
return self._logger
然后,如果我想在类或模块中记录某些东西,我只需导入记录器并创建一个实例。传递类名将为每个类创建一个文件。然后,记录器可以通过调试,信息,错误等将消息记录到其文件中:
from module_where_logger_is_defined import Logger
class MyCustomClass(object):
def __init__(self):
self.logger = Logger(self.__class__.__name__).get() # accessing the "private" variables for each class
def do_something():
...
self.logger.info('Hello')
def raise_error():
...
self.logger.error('some error message')
多年来,我改变了我使用Python日志的方式。主要基于良好实践,我在应用程序启动期间首先加载的任何模块中配置整个应用程序的日志记录,然后在每个文件中使用单独的记录器。例如:
# app.py (runs when application starts)
import logging
import os.path
def main():
logging_config = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default_handler': {
'class': 'logging.handlers.FileHandler',
'level': 'DEBUG',
'formatter': 'standard',
'filename': os.path.join('logs', 'application.log'),
'encoding': 'utf8'
},
},
'loggers': {
'': {
'handlers': ['default_handler'],
'level': 'DEBUG',
'propagate': False
}
}
}
logging.config.dictConfig(logging_config)
# start application ...
if __name__ == '__main__':
main()
# submodule.py (any application module used later in the application)
import logging
# define top level module logger
logger = logging.getLogger(__name__)
def do_something():
# application code ...
logger.info('Something happended')
# more code ...
try:
# something which might break
except SomeError:
logger.exception('Something broke')
# handle exception
# more code ...
以上是推荐的方法。每个模块都定义了自己的记录器,并且可以根据__name__
属性轻松识别在检查日志时哪个模块记录了哪个消息。这将从我的原始答案中删除样板,而是使用Python标准库中的logging.config
模块。
答案 1 :(得分:12)
文档provide a pretty good example of using your logger in multiple modules。基本上,您在程序开始时设置一次日志记录。然后,将日志记录模块导入到要记录的任何位置,并使用它。
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
import logging
def do_something():
logging.info('Doing something')
此示例显示了一个非常简单的记录器设置,但您可以非常轻松地使用various ways to configure logging来设置更高级的方案。
答案 2 :(得分:-1)
python中的内置日志记录模块需要一些代码行来配置类似log4j的功能,即文件追加器,基于时间和大小的文件轮换。
要对代码中的功能进行单行实现,可以使用软件包autopylogger
。
这是基础。
1。安装软件包
pip install autopylogger
2。用法
# import the package
from autopylogger import init_logging
# Initialise the logging module
mylogger = init_logging(log_name="myfirstlogger", log_directory="logsdir")
就是这样,日志记录对象已在启用文件写入和旋转功能的情况下初始化。
您可以通过以下命令编写日志。
# Write logs - DEBUG | INFO | WARNING | ERROR
mylogger.debug('This is a INFO log')
mylogger.info('This is a DEBUG log')
mylogger.warning('This is a WARNING log')
mylogger.error('This is a ERROR log')
为什么要使用自动pylogger?
文件添加器-默认情况下启用。
日志轮换-默认启用。还可基于基本日志记录库中缺少的time
和size
来配置轮换。
关键日志邮件功能-通过使用SMTP服务器凭据初始化库,为关键日志发送邮件。在生产环境中很方便。