动态创建Logger
来源:互联网 发布:html5 game 源码 编辑:程序博客网 时间:2024/06/05 01:00
示例依赖log4j2.xml,需要预先在里面创建一个配置模版
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?><configuration status="WARN" shutdownHook="disable"> <Properties> <Property name="sysName">schedule</Property> <Property name="bizLogLevel">@env.log4j2.biz.level@</Property> <Property name="otherLogLevel">@env.log4j2.other.level@</Property> <Property name="logFilePath">@env.log4j2.log.path@</Property> <Property name="logSize">@env.log4j2.log.size@</Property> <Property name="maxFile">100</Property> <Property name="errorLogFile">${sysName}_err</Property> <Property name="allLogFile">${sysName}_all</Property> </Properties> <appenders> <Console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] [%c:%line] - %msg%n"/> </Console> <RollingFile name="TaskCfgRollingFile" fileName="${logFilePath}/task-log-factory.log" filePattern="${logFilePath}/$${date:yyyy-MM}/${errorLogFile}-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] [%c:%line] - %msg%n"/> <Filters> <ThresholdFilter level="${bizLogLevel}"/> <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="${logSize}"/> </Policies> </RollingFile> <RollingFile name="AllRollingFile" fileName="${logFilePath}/${allLogFile}.log" filePattern="${logFilePath}/$${date:yyyy-MM}/${allLogFile}-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] [%c:%line] - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="${logSize}"/> </Policies> </RollingFile> </appenders> <loggers> <logger name="TaskCfgLogger" level="${bizLogLevel}" additivity="false"> <appender-ref ref="TaskCfgRollingFile"/> <appender-ref ref="Console"/> </logger> <root level="${otherLogLevel}"> <appender-ref ref="AllRollingFile"/> <appender-ref ref="Console"/> </root> </loggers></configuration>
package org.ideap.schedule.log;/** * Created by xiongpu on 2017/7/3. */public class AbyLogConfig { /** * log4j2.xml 里面定义的logger name 用来作为配置模板,目前支持 RollingFileAppender,ConsoleAppender,FileAppender */ private String cfgLogName; /** * 定义的logger 名称 */ private String name; /** * fileName="${logFilePath}/task-log-factory.log" 要替换的内容 比如这里task-log-factory替换为任务名称 */ private String fileNameKey; /** * 替换值 如任务名 */ private String fileName; // 省略get set}
package org.ideap.schedule.log;import org.apache.logging.log4j.Level;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.apache.logging.log4j.core.Appender;import org.apache.logging.log4j.core.LoggerContext;import org.apache.logging.log4j.core.appender.ConsoleAppender;import org.apache.logging.log4j.core.appender.FileAppender;import org.apache.logging.log4j.core.appender.RollingFileAppender;import org.apache.logging.log4j.core.config.AppenderRef;import org.apache.logging.log4j.core.config.Configuration;import org.apache.logging.log4j.core.config.LoggerConfig;import org.springframework.util.CollectionUtils;import java.util.ArrayList;import java.util.List;import java.util.Map;/** * Created by xiongpu on 2017/7/3. */public class AbyLogFactory { private static AbyLogFactory abyLogFactory = new AbyLogFactory(); private AbyLogFactory() { } public static AbyLogFactory getAbyLogFactory() { return abyLogFactory; } public void start(AbyLogConfig abyLogConfig) { //为false时,返回多个LoggerContext对象, true:返回唯一的单例LoggerContext final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); final Configuration config = ctx.getConfiguration(); org.apache.logging.log4j.core.Logger cfgLogger = (org.apache.logging.log4j.core.Logger) LogManager.getLogger(abyLogConfig.getCfgLogName()); if (cfgLogger == null) { LogManager.getLogger(AbyLogFactory.class).error("not found {} logger (please define in log4j2.xml)", abyLogConfig.getCfgLogName()); return; } Map<String, Appender> appenderMap = cfgLogger.getAppenders(); List<AppenderRef> appenderRefs = new ArrayList<>(); List<Appender> appenders = new ArrayList<>(); appenderMap.forEach((key, appenderCfg) -> { Appender appender = getAppender(abyLogConfig, config, appenderCfg); if (appender != null) { appender.start(); config.addAppender(appender); AppenderRef ref = AppenderRef.createAppenderRef(appender.getName(), null, null); appenderRefs.add(ref); appenders.add(appender); } }); if (CollectionUtils.isEmpty(appenders)) return; AppenderRef[] refs = new AppenderRef[appenderRefs.size()]; refs = appenderRefs.toArray(refs); LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.ALL, abyLogConfig.getName(), "true", refs, null, config, null); appenders.stream().forEach(e -> loggerConfig.addAppender(e, Level.ALL, null) ); config.addLogger(abyLogConfig.getName(), loggerConfig); ctx.updateLoggers(config); } private Appender getAppender(AbyLogConfig abyLogConfig, Configuration config, Appender appenderCfg) { Appender appender = null; if (appenderCfg instanceof RollingFileAppender) { RollingFileAppender rollingFileAppender = (RollingFileAppender) appenderCfg; appender = RollingFileAppender.newBuilder() .withConfiguration(config) .withName(abyLogConfig.getName() + "RollingFile") .withFileName(rollingFileAppender.getFileName().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName())) .withFilePattern(rollingFileAppender.getFilePattern()) .withLayout(rollingFileAppender.getLayout()) .withFilter(rollingFileAppender.getFilter()) .withPolicy(rollingFileAppender.getTriggeringPolicy()) .build(); } else if (appenderCfg instanceof ConsoleAppender) { ConsoleAppender consoleAppender = (ConsoleAppender) appenderCfg; appender = ConsoleAppender.newBuilder() .withName(abyLogConfig.getName() + "Console") .withLayout(consoleAppender.getLayout()) .build(); } else if (appenderCfg instanceof FileAppender) { FileAppender fileAppender = (FileAppender) appenderCfg; appender = FileAppender.newBuilder() .withConfiguration(config) .withName(abyLogConfig.getName() + "File") .withFileName(fileAppender.getFileName().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName())) .withLayout(fileAppender.getLayout()) .withFilter(fileAppender.getFilter()) .build(); } else { LogManager.getLogger(AbyLogFactory.class).warn("unsupported appender type ,appender type not in(RollingFileAppender,ConsoleAppender,FileAppender)", appenderCfg.getClass()); } return appender; } /** * 获取Logger * * @param abyLogConfig * @return */ public Logger createLogger(AbyLogConfig abyLogConfig) { if (!LogManager.exists(abyLogConfig.getName())) { start(abyLogConfig); } return LogManager.getLogger(abyLogConfig.getName()); }}
测试
package org.ideap.schedule;import org.apache.logging.log4j.Logger;import org.ideap.schedule.log.AbyLogConfig;import org.ideap.schedule.log.AbyLogFactory;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class AbyScheduleServerApplicationTests { @Test public void contextLoads() { AbyLogConfig abyLogConfig=new AbyLogConfig(); abyLogConfig.setName("test1"); abyLogConfig.setCfgLogName("TaskCfgLogger"); abyLogConfig.setFileNameKey("task-log-factory"); abyLogConfig.setFileName(abyLogConfig.getName()); Logger logger= AbyLogFactory.getAbyLogFactory().createLogger(abyLogConfig); logger.info("------------创建成功--------------"); logger.error("------------创建成功--------------"); }}
测试结果
参考:https://www.feehi.com/view/4346
有问题欢迎指正~
阅读全文
0 0
- 动态创建Logger
- Log4j 程序中动态创建多个logger 生成不同的日志文件
- python 动态增加logger handler
- log4j创建Logger实例解读
- 如何创建自定义 logger 格式化?
- Logger
- logger
- logger
- logger
- Logger
- Logger
- Logger
- Logger
- Log4j源代码阅读—Logger创建
- 创建单件模式的Logger类
- log4j源码阅读之Logger创建
- log4j2 不使用配置文件,动态生成logger对象
- log4j2 不使用配置文件,动态生成logger对象
- Ubuntu中添加和删除PPA源
- java8 lamda表达式
- 第七篇:SPDY
- 欧拉函数简单的运用
- 使用VMware虚拟机搭建本地局域网服务器CentOS+Nginx+MySQL+PHP
- 动态创建Logger
- 网络协议
- Ubuntu12.04下Linphone编译环境搭建
- Hibernate与Jpa的关系
- LELE的RPG难题
- 走出一地鸡毛的“黑盒”,互联网家装进入标准化时代
- python爬虫源码
- 解决scrollview+listview的冲突问题
- UIButton上图片和文字的位置调整