iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >log4j如何控制日志输出文件名称
  • 879
分享到

log4j如何控制日志输出文件名称

2023-06-22 05:06:29 879人浏览 八月长安
摘要

小编给大家分享一下log4j如何控制日志输出文件名称,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!log4j控制日志输出文件名称1. 第一种方式在类对象中用如下方

小编给大家分享一下log4j如何控制日志输出文件名称,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    log4j控制日志输出文件名称

    1. 第一种方式

    在类对象中用如下方式定义logger变量

    private static Logger logger = Logger.getLogger("lemmaXml");

    这样通过名称的方式获取logger,需要在log4j.properties文件中定义一个名称为lemmaXml的appender,配置如下:

    log4j.logger.lemmaXml=INFO,lemmaXmllog4j.appender.lemmaXml=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.lemmaXml.Threshold=DEBUGlog4j.appender.lemmaXml.File=${catalina.home}/logs/lemmaXml.loglog4j.appender.lemmaXml.layout=org.apache.log4j.PatternLayoutlog4j.appender.lemmaXml.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %m %n

    上述配置说明,名称为lemmaXml的appender,是每天形成一个日志文件,日志文件的名称为

    ${catalina.home}/logs/lemmaXml.log

    日志的格式为

    %5p %d{yyyy-MM-dd HH:mm:ss} %m %n

    2. 第二种方式(这种方式亲测正确)

    在类对象中用如下方式定义logger变量

    import org.apache.log4j.Logger;private static Logger logger = Logger.getLogger(ExportLemmaManagerService.class);

    即,通过类的参数来获取logger变量,此时必然也需要在log4j.properties文件有关于该对象日志文件的输出配置,当然这里的配置不是针对每个类专门配置,而是针对一个路径整体配置,即,你可以配置某个目录下的所有类方式的输出文件的文件名称,如下

    log4j.rootLogger=info,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Threshold=DEBUGlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n  log4j.logger.com.soso.baike.service=DEBUG,ServiceLoglog4j.appender.ServiceLog=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.ServiceLog.Threshold=DEBUGlog4j.appender.ServiceLog.File=${catalina.home}/logs/service.loglog4j.appender.ServiceLog.MaxBackupIndex=10log4j.appender.ServiceLog.layout=org.apache.log4j.PatternLayoutlog4j.appender.ServiceLog.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n

    上述配置了目录com.soso.baike.service下的输出文件方式,上述ExportLemmaManagerService类就是在该包下,所以用该包下的类方式来定义logger的话,输出的文件就都在service.log文件中,每天生成一个新的日志文件。

    如何随心所欲地自定义log4j输出格式

    在某种情况下,我们需要在不影响原有代码的基础上自定义log4j的输出格式。

    例如这样的需求,硬性规定了项目的日志格式为:

    日期 日志等级 ClassName:line - [版本号] [请求ip地址] [项目应用名称] [服务接口模块] [模块方法] [业务参数1] [业务参数2] [业务参数3] 日志详细内容(必须为JSON格式)

    示例:

    2018-05-10 14:04:50,972 INFO ViolationService:51 - [v1.0.0] [192.168.137.47] [merchant-service.cx580.com] [OrderController] [messageList] [null] [] [] {"body":"订单状态消息列表resp:{\"code\":1000,\"msg\":\"成功\"}"}

    其中:

    • 版本号是指当前服务接口实际的版本信息,例如V1.0.1;

    • 请求ip地址为用户真实的请求ip;

    • 项目应用名称为项目的名称或者标识,例如支付服务定义应用名称为payService;

    • 服务接口模块是指请求接口对应的模块代码,例如请求订单接口,则接口模块为OrderControlller;

    • 模块方法是指接口对应的请求方法,例如下单接口对应模块方法为createOrder;

    • 业务参数1可根据实际情况写入相应的业务数据,录入订单号orderId,该参数可为空;

    • 业务参数2同上;

    • 业务参数3同上;

    • 日志详细内容是指请求接口时需打印出来的描述信息,例如创建订单异常时,在异常捕捉方法体中描述异常详细信息,日志内容需定义到一个json结构中。

    以上是我遇到的场景,这时在不影响原有项目代码的基础上,我们做出日志格式的调整,使用如下方案:

    通过log4j的占位替换符%X{}配合MDC格式化日志,使用aop切面在请求线程开始处填充替换符变量

    继承log4j的具体appender类,重写subAppend方法,修改日志输出的内容格式。

    此时log4j文件如下

    log4j.rootCateGory=INFO, stdout, file, errorfile#log4j.category.com.cx=DEBUGlog4j.logger.error=errorfile log4j.appender.stdout=com.test.common.GrayLoGConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L%X{log_version}%X{log_ip}%X{log_item}%X{log_module}%X{log_method}%X{log_req_params} %m%n log4j.appender.file=com.test.common.GrayLogDailyRollingFileAppenderlog4j.appender.file.file=${log.dir}/${spring.application.name}.loglog4j.appender.file.DatePattern='.'yyyy-MM-ddlog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L%X{log_version}%X{log_ip}%X{log_item}%X{log_module}%X{log_method}%X{log_req_params} %m%n log4j.appender.errorfile=com.test.common.GrayLogDailyRollingFileAppenderlog4j.appender.errorfile.file=${log.dir}/${spring.application.name}_error.loglog4j.appender.errorfile.DatePattern='.'yyyy-MM-ddlog4j.appender.errorfile.Threshold = ERRORlog4j.appender.errorfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L%X{log_version}%X{log_ip}%X{log_item}%X{log_module}%X{log_method}%X{log_req_params} %m%n

    在log4j.properties文件,我们做了两个变动,一个是添加了%X{value}的变量,另一个则是将原本的DailyRollingFileAppender修改成了com.test.common.GrayLogConsoleAppender。

    处理log4j的变量,对代码进行controller切面,在一个Http请求java的入口中放入线程变量,该线程变量在当次http请求生命周期内生效。

    切面代码如下:

    @Around("execution(public * com.test.controller..*.*(..))")    public Object aroundController(ProceedingJoinPoint joinPoint) {        ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();        httpservletRequest request =attributes.getRequest();        String execIp = request.getHeader("X-Real-IP");        if(StringUtils.isBlank(execIp)){            execIp=request.getRemoteAddr();        }        String execClass= joinPoint.getTarget().getClass().getSimpleName();        String execMethod = joinPoint.getSignature().getName();        Map<String,String[]> map = request.getParameterMap();        List<String> paramsList = new ArrayList<>();        for(Map.Entry<String,String []> m : map.entrySet()){            String [] value = m.getValue();            paramsList.add( m.geTKEy() + "=" + StringUtils.join(value,","));        }         String execParams = "[" + StringUtils.join(paramsList,"&") + "] [] []";        MDC.put("log_version"," - [V1.0.0]");        MDC.put("log_item"," [violation-mini]");        MDC.put("log_module"," [" + execClass + "]");        MDC.put("log_method"," [" + execMethod+ "]");        MDC.put("log_req_params"," " + execParams);        MDC.put("log_ip"," [" + execIp+ "]");        Object result= null;        try {            result = joinPoint.proceed();        } catch (Throwable throwable) {            LOGGER.error("方法异常:",throwable);        }        return result;    }

    至此,格式中的MDC变量都已被放入成功。

    下一步,将原本的日志内容套上json外套。

    新建GrayLogConsoleAppender类继承具体的appender类

    代码如下:

    package com.test.common; import net.sf.json.JSONObject;import org.apache.commons.lang.StringUtils;import org.apache.log4j.ConsoleAppender;import org.apache.log4j.spi.LoggingEvent;import org.apache.log4j.spi.ThrowableInfORMation; import java.lang.reflect.Field; public class GrayLogConsoleAppender extends ConsoleAppender {    @Override    protected void subAppend(LoggingEvent event) {        try {            Class<LoggingEvent> clazz = LoggingEvent.class;            Field filed = clazz.getDeclaredField("throwableInfo");            filed.setAccessible(true);            Object exception = filed.get(event);            JSONObject json = new JSONObject();            if(exception != null){                if(exception instanceof ThrowableInformation){                    ThrowableInformation throwableInformation = (ThrowableInformation) exception;                    String [] details = throwableInformation.getThrowableStrRep();                    String error_msg = StringUtils.join(details,"\r\n");                    json.put("exception",error_msg);                }            }            filed.set(event,null);            boolean flag = false;            Field filed1 = clazz.getDeclaredField("message");            filed1.setAccessible(true);            Object message = filed1.get(event);            if (message instanceof String) {                String msg = (String) message;                if (message != null) {                    flag = true;                }                json.put("body", msg);                filed1.set(event, json.toString());            }            if(!flag){                Field filed2 = clazz.getDeclaredField("renderedMessage");                filed2.setAccessible(true);                Object message2 = filed2.get(event);                if (message2 instanceof String) {                    String msg = (String) message2;                    json.put("body", msg);                    filed2.set(event, json.toString());                }            }        } catch (Exception e) {            e.printStackTrace();        }        super.subAppend(event);    }}

    至此,已为日志内容套上json外套,并且当有异常日志时,将异常的堆栈信息放入json的exception中输出出来,不打印堆栈信息。

    最终结果:

    2018-06-09 00:48:31,849 INFO LogAspect:65 - [V1.0.0] [223.88.53.135] [violation-mini] [TestController] [queryList] [appName=abc&authType=test&avatar=&nickName=&token=asdfasdfadsfasdf&userId=asdfasdfasdfasdf&userType=aaaaa] [] [] {"body":"结果为:ResponseResult{code='0', msg='null', errormsg='查询成功', data={}, successFlag=false}"}

    以上是“log4j如何控制日志输出文件名称”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

    --结束END--

    本文标题: log4j如何控制日志输出文件名称

    本文链接: https://www.lsjlt.com/news/302871.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • log4j如何控制日志输出文件名称
      小编给大家分享一下log4j如何控制日志输出文件名称,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!log4j控制日志输出文件名称1. 第一种方式在类对象中用如下方...
      99+
      2023-06-22
    • log4j控制日志输出文件名称的两种方式小结
      目录log4j控制日志输出文件名称1. 第一种方式2. 第二种方式(这种方式亲测正确)如何随心所欲地自定义log4j输出格式log4j控制日志输出文件名称 1. 第一种方式 在类对象...
      99+
      2022-11-12
    • Python如何将控制台输出另存为日志文件
      目录Python将控制台输出另存为日志文件需求  方法一:使用 Logger 类(推荐)方法二:仅使用 sys方法三:使用 logging 模块Python记录日...
      99+
      2023-05-19
      Python控制台 Python日志文件 Python控制台输出
    • 使用Java如何监控并输出日志文件
      使用Java如何监控并输出日志文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码1:日志产生类package com.bill99.seashell.domain.svr;...
      99+
      2023-05-31
      java ava
    • docker日志如何输出到文件
      在Docker中,可以使用以下两种方式将日志输出到文件:1. 使用Docker日志驱动(Logging Driver):Docker...
      99+
      2023-09-28
      docker
    • python 实现logging动态变更输出日志文件名
      python作为一门非常容易上手的脚本语言,日志输出更是简单,logging模块,简单的设置配置和属性,就能实现到控制台输出日志,在basicConfig()设置文件名,就能够将日志...
      99+
      2022-11-11
    • maven如何使用slf4j输出日志到文件
      目录使用slf4j输出日志到文件log4j.propertiesslf4j将部分日志打印在其他文件中logback.xml配置中新增一个FileAppender在需要额外打印日志的地...
      99+
      2022-11-13
    • nginx中如何输出php错误日志文件
      这篇文章主要介绍“nginx中如何输出php错误日志文件”,在日常操作中,相信很多人在nginx中如何输出php错误日志文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx中如何输出php错误日志文件...
      99+
      2023-07-05
    • linux如何把日志输出到文本
      在Linux中,可以通过重定向操作符将日志输出到文本文件中。你可以使用以下命令将命令的输出重定向到文件:```command > l...
      99+
      2023-10-09
      linux
    • Python 如何限制输出日志的大小
      限制输出日志的大小有多种方法,最优雅的莫过于直接使用rotate机制,这种机制广泛存在于各种编程语言,Python也不例外。其次,还可以使用mount挂载一个文件,作为日志存储的位置...
      99+
      2022-11-11
    • nohup 输出到指定文件 Linux nohup 实现命令后台运行并输出或记录到指定日志文件 设置日志结果文件名称 重定向到某个文件 标准误 标准错误输出定向 输入报错信息保留
      后台运行命令:nohup nohup命令:nohup是不挂断的意思( no hang up)。如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令忽略所有挂(SIGHUP)信号,可以在你退出帐户...
      99+
      2023-09-01
      linux 运维 服务器
    • win7如何导出文件夹的所有名称
      在Windows 7中,您可以使用命令提示符或PowerShell来导出文件夹的所有名称。以下是两种方法的说明:使用命令提示符:1....
      99+
      2023-09-28
      win7
    • python如何输出文件夹的名字
      python中输出文件夹名字的方法:在python中可以使用print函数进行打印输出操作,该函数在Python3.x是一个函数,但在 Python2.x版本不是一个函数,只是一个关键字;需要使用os.path.dirname()方法获取目...
      99+
      2022-10-15
    • 如何使用shell将脚本输出结果记录到日志文件
      这篇文章将为大家详细讲解有关如何使用shell将脚本输出结果记录到日志文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用tee命令:sh portal/main.sh |tee log.txt获取脚本...
      99+
      2023-06-09
    • Linux下如何实时监控日志文件
      这篇文章给大家分享的是有关Linux下如何实时监控日志文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何在Linux中实时查看日志文件的内容有很多实用工具可以帮助用户在文件修改或不断更新时跟踪或监控文件发生的...
      99+
      2023-06-27
    • Linux中如何实时监控日志文件
      这期内容当中小编将会给大家带来有关Linux中如何实时监控日志文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. tail Command &ndash; Monitor Logs in Re...
      99+
      2023-06-16
    • shell如何获取目录下所有文件夹的名称并输出的实例
      这篇文章将为大家详细讲解有关shell如何获取目录下所有文件夹的名称并输出的实例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。获取指定目录/usr/下所有文件夹的名称并输出:shell代码:#!/bin/...
      99+
      2023-06-09
    • Spring如何按业务模块输出日志到不同的文件详解
      目录一、背景二、需求三、技术实现四、代码实现1、编写xml日志文件2、编写QQ模块的代码3、编写login模块的代码五、运行结果六、完整代码七、一个小知识点总结一、背景 在我们开发的...
      99+
      2022-11-13
    • 如何从指定的网络端口上采集日志到控制台输出和HDFS
      小编给大家分享一下如何从指定的网络端口上采集日志到控制台输出和HDFS,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!需求1:从指定的网络端口上采集日志到控制台输出和HDFS负载算法故障转移:可以指定优先级,数字越大越优先a...
      99+
      2023-06-02
    • @Slf4j 如何实现日志输入到外部文件
      目录@Slf4j实现日志输入到外部文件1. 添加一个配置文件直接在代码中使用@Slf4j日志文件打印和输出文件首先配置lombok添加一个配置文件方法中的使用@Slf4j实现日志输入...
      99+
      2022-11-12
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作