ModuleLogger接口继承自slf4j的Logger接口,并扩展了5个入参为LogSchema的方法。
在getInnerLogger方法中,我们调用了ModuleLoggerRepository.getModuleLogger(this.name())方法,这个方法是真正获取日志对象的地方, 具体代码如下:
https://github.com/lvyahui8/feegocommon/blob/master/feegocommonloggingcore/src/main/java/io/github/lvyahui8/core/logging/ModuleLoggerRepository.java
public class ModuleLoggerRepository {
private static final Map<String, Logger> moduleLoggerMap = new ConcurrentHashMap<>();
public static Logger getModuleLogger(String moduleName) {
return moduleLoggerMap.computeIfAbsent(moduleName, k > initLogger(k));
}
private static Logger initLogger(String moduleName) {
// 初始化logger
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
// 根据业务模块名生成日志文件路径
String logPath = "logs" + File.separator + moduleName;
// 创建日志文件滚动策略
RollingFileAppender<ILoggingEvent> rollingAppender = RollingFileAppender.createAppender(logPath + ".log", "true", "10MB", "10");
// 设置日志格式
rollingAppender.setFormatter(new PatternLayoutEncoder());
// 创建logger
Logger logger = context.getLogger(moduleName);
logger.addAppender(rollingAppender);
logger.setLevel(Level.INFO);
return logger;
}
3、3 如何实现模块化?
日志模块化,主要是通过不同的业务模块输出到不同的日志文件来实现的,这里有两个关键点
每个业务模块都有一个独立的日志文件
日志文件的命名和存储结构需要符合一定的规范
在initLogger中, 我们根据业务模块名生成日志文件路径,然后创建一个RollingFileAppender, 并设置了日志滚动策略和日志格式,最后将这个appender添加到logger中,并设置好日志级别。
这样, 我们就实现了一个业务模块对应一个日志文件的需求, 并且这些日志文件都统一放在一个logs文件夹下, 方便查看和管理。
至此,我们已经了解了这款工具的用法和实现原理,可以看出,它非常适合于业务开发初期,多人协作开发同一个应用的场景, 可以快速实现日志模块化,提高开发效率,由于其内部使用了动态代理和Java编译时注解处理器等技术,使得工具具有很高的灵活性和可扩展性。
参考资料
https://github.com/lvyahui8/feegocommon/tree/master/feegocommonloggingstarter
https://github.com/lvyahui8/feegocommon/tree/master/feegocommonloggingcore
开通日志模块_日志模块
在现代软件开发过程中,日志模块扮演着至关重要的角色,日志不仅可以帮助我们了解软件系统的运行状态,还能在系统出现错误时迅速定位问题,Python的logging
模块是实现这一功能的核心工具之一,它提供了一套完整的日志记录解决方案,能够帮助开发者有效地捕获、处理和记录日志信息,以下是关于日志模块的相关介绍:
1、基本组成
Logger:Logger是应用程序直接使用的接口,负责生成日志消息,可以通过设置不同的日志级别来控制哪些消息被记录。
Handler:Handler负责将日志消息发送到目的地,如控制台、文件等,每种Handler都可以设置日志级别和格式化程序。
Filter:Filter提供了更精细的控制,用于决定哪些日志记录应该被最终输出。
Formatter:Formatter定义了日志消息的最终输出格式,比如时间格式、消息格式等。
2、使用示例
创建一个基本的日志记录器并输出到控制台:
import logging 创建日志记录器 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) 创建控制台处理器 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) 创建格式器 formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') ch.setFormatter(formatter) 将处理器添加到记录器 logger.addHandler(ch) 记录一些日志 logger.debug('This is a debug message') logger.info('This is an info message') logger.warning('This is a warning message') logger.error('This is an error message') logger.critical('This is a critical message')
将日志记录到文件并实现自动滚动:
import logging from logging.handlers import RotatingFileHandler 创建日志记录器 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) 创建滚动文件处理器,并设置最大备份文件数和每个文件的最大字节数 rh = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10) rh.setLevel(logging.DEBUG) 创建格式器 formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') rh.setFormatter(formatter) 将处理器添加到记录器 logger.addHandler(rh) 记录一些日志 for _ in range(3000): logger.debug('This is a debug message')
在代码中动态改变日志级别:
import logging logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) 假设在某个时刻,我们只想看ERROR及以上级别的日志 logger.setLevel(logging.ERROR)
3、最佳实践
在模块级别使用__name__
创建logger:这样可以清晰地知道日志来自哪个模块。
使用合适的日志级别:合理使用不同的日志级别可以帮助我们快速筛选出关心的信息。
使用结构化的日志消息:例如使用JSON格式记录日志,便于后续的日志分析。
使用异常日志记录:使用logger.exception()
可以记录异常堆栈信息,便于问题排查。
不要在日志中记录敏感信息:避免记录可能被利用的敏感数据。
Python的logging
模块提供了一个强大且灵活的框架,用于记录和管理日志,通过合理配置和使用最佳实践,可以极大地提高开发效率和程序的可维护性。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/783924.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复