log4j2 个性化日志名
来源:互联网 发布:淘宝尺寸勾选 编辑:程序博客网 时间:2024/06/07 03:47
目的:
利用log4j2进行请求中的手机号码的收集,并将收集到的日志文件存放在共享磁盘里。
问题:
由于多台服务器写日志,那么就需要给每台服务器打印的日志文件加个前缀名,以免冲突。
解决方案:
参考:http://logging.apache.org/log4j/2.0/manual/lookups.html#SystemPropertiesLookup
解决方案一:
可以选着采用获取系统变量的方式进行日志文件名的个性化。
引用:https://jingyan.baidu.com/article/597a0643207829312b5243e3.html
但是需要注意的是,在配置好环境变量后需要重启IDE,不然会扑街,就是${env:LOG_NAME}直接显示的情况。
解决方案二:
采用System Properties Lookup,虽然官网的介绍非常简单,但是使用起来就很蛋疼,怎么着都不管用。折腾了大把时间,才搞出来,分享一下吧:
log4j2.yml
Configuration: status: warn Properties: # 定义全局变量 Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下: #测试:-Dlog.level.console=warn -Dlog.level.xjj=trace #生产:-Dlog.level.console=warn -Dlog.level.xjj=info - name: log.level.console value: trace - name: log.level.hbc.api value: trace - name: log.path value: ../log4j2logs/appspider - name: phone.path value: /data1/appspider/data/phonefiles/in - name: project.name value: global - name: phonefile.name value: phone Appenders: Console: #输出到控制台 name: CONSOLE target: SYSTEM_OUT ThresholdFilter: level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 onMatch: ACCEPT onMismatch: DENY PatternLayout: pattern: "%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread](%file:%line) - %m%n" RollingRandomAccessFile: # 输出到文件 - name: ROLLING_FILE ignoreExceptions: false fileName: ${log.path}/${project.name}.log filePattern: "${log.path}/${project.name}.%d{yyyy-MM-dd-HH}.log" PatternLayout: pattern: "%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread](%file:%line) - %m%n" Policies: TimeBasedTriggeringPolicy: interval: 1 modulate: true# SizeBasedTriggeringPolicy:# size: "128 MB"# DefaultRolloverStrategy:# max: 1000 - name: PHONE_FILE ignoreExceptions: true # 是否忽略异常 fileName: ${phone.path}/${sys:LOG_PREFIX}.${phonefile.name}.log # 日志名称,可以引用系统变量但是注意重启idea才能加载 filePattern: "${phone.path}/${sys:LOG_PREFIX}.${phonefile.name}.%d{yyyyMMdd}.txt" # 回滚后文件名称 PatternLayout: pattern: "%m%n" # 打印内容格式 Policies: TimeBasedTriggeringPolicy: interval: 1 modulate: true DefaultRolloverStrategy: 7 # 最大保留个数 Loggers: Root: level: info AppenderRef: - ref: CONSOLE - ref: ROLLING_FILE Logger: # 配置特殊的Log级别,方便调试 - name: sys:log.level.hbc.api additivity: false level: ${sys:log.level.hbc.api} AppenderRef: - ref: CONSOLE - ref: ROLLING_FILE - name: com.hbc.api.common.collect.CollectPhoneToFile additivity: false level: info AppenderRef: - ref: PHONE_FILE
fileName: ${phone.path}/${sys:LOG_PREFIX}.${phonefile.name}.log
对应的java代码:
public class CollectPhoneToFile { private static Logger logger ; //遗留一个问题,每次启动项目多生成一个${sys文件,后续再处理吧 static { System.setProperty("LOG_PREFIX", getIpAdress()); LoggerContext ctx =(LoggerContext) LogManager.getContext(false); ctx.reconfigure(); logger = LoggerFactory.getLogger(CollectPhoneToFile.class); } public static void write(String info){ logger.info(info); } /** * 获取IP地址 * * @return IP地址 */ private static String getIpAdress(){ String serverIP = "" ; try{ serverIP = InetAddress.getLocalHost().getHostAddress(); }catch(Exception e){ e.printStackTrace() ; } return serverIP ; }
其中绝大部分分人卡在下面两句:
LoggerContext ctx =(LoggerContext) LogManager.getContext(false); ctx.reconfigure();
但是按照我的方法解决后,还是会遗留一个问题。就是系统启动时多生产了一个${sys:LOG_PREFIX}.phone.log文件,我还没有找到优雅一点的办法解决它,暂且先放放。
解决方案三;
如果你只是想在文件里搞个特殊名堂,那么代码会简单很多:
public class CollectPhoneToFile { private static Logger logger ; //遗留一个问题,每次启动项目多生成一个${sys文件,后续再处理吧 static { System.setProperty("LOG_PREFIX", getIpAdress());// LoggerContext ctx =(LoggerContext) LogManager.getContext(false);// ctx.reconfigure(); logger = LoggerFactory.getLogger(CollectPhoneToFile.class); } public static void write(String info){ logger.info(info); } /** * 获取IP地址 * * @return IP地址 */ private static String getIpAdress(){ String serverIP = "" ; try{ serverIP = InetAddress.getLocalHost().getHostAddress(); }catch(Exception e){ e.printStackTrace() ; } return serverIP ; }}
但是,这样做的话,文件名就无法个性化。其实可以找到一个好一点的办法就是讲静态块里的代码放在项目启动最前面进行设定System.setProperty("LOG_PREFIX", getIpAdress());,由于我是用的是springboot,不太好找那个地方,也试着去搞一搞结果都不是很理想。
--------------- 华丽的分割线 -----------
各位看官,谁有更好的方法可以推荐一下哦!!!
阅读全文
0 0
- log4j2 个性化日志名
- log4j2配置mybatis日志
- log4j2 按天分日志
- Java日志-Log4J2
- log4j2 日志配置
- Log4j2实现异步日志
- LOG4J2 异步日志
- SpringBoot - 日志集成 Log4j2
- log4j2日志配置
- log4j2 按天分日志
- log4j2 日志配置实战
- 日志学习:SLF4J & Log4J2
- Log4j2日志配置
- springboot日志体系---log4j2
- log4j2 支持彩色日志
- LOG4J2 异步日志
- springmvc 加入log4j2日志
- 使用log4j2打印日志
- python3 os.path 模块常用方法汇总
- JPA和Spring-Data-JPA简介
- c++字符串的插入与删除操作
- Android7.0 init.rc流程分析
- 局部变量、 全局变量、 堆、 堆栈、 静态和全局
- log4j2 个性化日志名
- 02_ACS550变频器RS485Modbus通信-通信命令
- JavaWeb学习心得之JSP原理
- spark streaming 使用socket数据来源
- linux学习---进程控制(fork,vfork,popen,exec,system)
- MindManager2018中文版发布,新版新发现!
- 图解phpstorm常用快捷键
- char * 与 string 类型相互转换方法--C/C++
- matlab函数bsxfun、crossvalind、ismember,kmean