精华内容
下载资源
问答
  • 所以我们来讲讲非常规的日志格式,因为项目过程,肯定会有一个整体格式,像那种常规的的解析方式的话,我们可能就处理不了 如 [接口调用] [开始时间 1614073281781] [接口 TestController-getAreaChildList] [参数 ...

    elk的好处,我就不用说明了,部署的话可以参考

    快速搭建ELK日志分析系统,点击这里

    然后日志的常规格式方式,我也不做说明了,请看这里

    ELK 经典用法—企业自定义日志收集切割和mysql模块

    所以我们来讲讲非常规的日志格式,因为项目过程,肯定会有一个整体格式,像那种常规的的解析方式的话,我们可能就处理不了

    [接口调用] [开始时间 1614073281781] [接口 TestController-getAreaChildList] [参数 [AreaChildListBo(countryId=demoData, parentId=demoData),]] [异常 系统异常] [异常编码 Exception] [异常描述 Exception :  -at com.zyd.zydiot.base.controller.TestController.getAreaChildList(TestController.java:22) -at com.zyd.zydiot.base.controller.TestController$$FastClassBySpringCGLIB$$359ad4f2.invoke(<generated>) -at com.zyd.zydiot.zyd_common.config.log.InterfaceLogConfig.log(InterfaceLogConfig.java:62) -at com.zyd.zydiot.base.controller.TestController$$EnhancerBySpringCGLIB$$3f3e8ce7.getAreaChildList(<generated>)] [耗时 1] [IP: 127.0.0.1] [用户: UNLOGIN][访问路径: /test/test] [ServiceNode: 192.168.100.132] [Request Header: content-type:application/json; charset=utf-8    accept:application/json    content-length:55    content-encoding:UTF-8    host:localhost:4019    connection:Keep-Alive    user-agent:Apache-HttpClient/4.5.6 (Java/1.8.0_152-release)    accept-encoding:gzip,deflate    ]

    还有这种

    [SQL 调用] [开始时间 1614146478640] [Mapper com.zyd.zydiot.base.mapper.TBsWeatherMapper.getAlertNow] [SQL select area_id,tdate,condition_id,condition_id_day,condition_id_night,`condition`,condition_day,condition_night, temp,temp_day,temp_night,wind_dir,wind_dir_day,wind_dir_night,wind_level,wind_level_day,wind_level_night, humidity,air_value,pm25,pm10,co,no2,coC,no2C from t_bs_weather where area_id = '330100' order desc limit 1] [异常 SQL异常] [异常描述 Exception :  -at com.zyd.zydiot.zyd_common.config.log.SqlLogConfig.intercept(SqlLogConfig.java:62) -at com.zyd.zydiot.base.service.imp.TBsWeatherServiceImpl.getAlertNow(TBsWeatherServiceImpl.java:48) -at com.zyd.zydiot.base.controller.TestController.getAreaChildList(TestController.java:25) -at com.zyd.zydiot.base.controller.TestController$$FastClassBySpringCGLIB$$359ad4f2.invoke(<generated>) -at com.zyd.zydiot.zyd_common.config.log.InterfaceLogConfig.log(InterfaceLogConfig.java:62) -at com.zyd.zydiot.base.controller.TestController$$EnhancerBySpringCGLIB$$9f7dc834.getAreaChildList(<generated>)] [耗时 58] 
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@864217f]

    所以在处理这种格式化的话,你会发现很头疼

    然而强大的官方给了你自己定义格式的方式,是什么呢?自然是正则表达式的自定义格式

    直接贴上面例子的表达式

    (?<desc>\[接口调用\])\s*(?<startTime>\[开始时间\s[0-9]*\])\s*(?<interface>\[接口\s[\w\-\w]*\])\s*(?<args>\[参数\s\[[\w*\([\w*\=\w*\,*\s*]*[\w*\=\w*\)*]\,\]\]]*|[\w*\,*\]\]]*)\s*(?<result>\[异常\s[\u4e00-\u9fa5]*\])\s*(?<exception>\[异常编码\s\w*\])\s*(?<exceptionstack>\[异常描述\s.*\])\s*(?<cost>\[耗时\s[0-9]*\])\s*(?<custip>\[IP:\s[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}]*\])\s*(?<user>\[用户:\s[\u4e00-\u9fa5_a-zA-Z0-9]*\])\s*(?<path>\[访问路径:\s[\/\w]*\])\s*(?<ServiceNode>\[ServiceNode:\s[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}]*\])\s*(?<origin>\[Request\sHeader:\s.*\])

    解析后的结果如下

    是不是一下子就知道到了很强大

    强烈推荐grok的在线解析工具,方便验证正则式的正确性,点击这里

    然后其实这不是重点,重点的是我接下来要说明的,明眼人一下就看出来了,有一个

    <异常描述 Exception>

    这个结构的表达式,居然是

    (?<exceptionstack>\[异常描述\s.*\])

    这个  " .* "难道不是匹配所有的字符串嘛,为什么,这里可以解析到对应的结构?而且这么复杂的字段居然可以用这个代替,突然觉得好神奇

    原因是在于后面有一个

    (?<cost>\[耗时\s[0-9]*\])

     对,就是这个表达式在里面,如果没有的话,就会变成

    是的,真的就把后面的东西都匹配上了,因此我们可以得出一个结论

    " .* "可以匹配所有的字符串,但是如果后面还有表达式的话,那么他的结束点就是下一个表达式的开始点,

    哦豁,是不是佩服官方的强大!!!!!!

    以上是本人的观点,由于是刚开始学习elk,肯定会有不懂的地方(理直气状),所以在这里记录学到的新知识,如果有错观迎提出,谢谢大家

     

     

     

     

     

     

     

    展开全文
  • # 设定日志格式 Nginx 1.1.2 之后log_format 必须写在 server外面, main为这个格式的名称log_format main# 客户端地址'$remote_addr '# 服务器时间'$time_local '# 请求内容,包括方法名,地址,和http协议'$request...

    # 设定日志格式 Nginx 1.1.2 之后log_format 必须写在 server外面, main为这个格式的名称

    log_format main

    # 客户端地址

    '$remote_addr '

    # 服务器时间

    '$time_local '

    # 请求内容,包括方法名,地址,和http协议

    '$request '

    # 用户请求时使用的http地址

    # '' 中的代表一个值, 值与值之间在日志中不会有空格, 所以需要加个空格, 可以写在一个''中, 同一行

    # 客户端地址

    '$remote_addr '

    # 服务器时间

    '$time_local '

    # 请求内容,包括方法名,地址,和http协议

    '$request '

    # 用户请求时使用的http地址

    '$http_host '

    # 返回的 http 状态码

    '$status '

    # 请求大小

    '$request_length '

    # 返回的大小

    '$body_bytes_sent '

    # 来源页

    '$http_referer '

    # 用户代理

    '$http_user_agent '

    # 整体请求延时

    '$request_time ';

    access_log logs/access.log main;

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '

    # '$status $body_bytes_sent "$http_referer" '

    # '"$http_user_agent" "$http_x_forwarded_for"';

    展开全文
  • 记录一次,springboot集成logback,自定义日志格式,输入到es 1.涉及依赖版本 <!--springboot版本--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>...

    记录一次,springboot集成logback,自定义日志格式,输入到es

    1.涉及依赖版本

    <!--springboot版本-->
    <parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.1.10.RELEASE</version>
    		<relativePath/> 
    </parent>
    <!--logstash-->
    		<dependency>
    			<groupId>net.logstash.logback</groupId>
    			<artifactId>logstash-logback-encoder</artifactId>
    			<version>5.3</version>
    		</dependency>

    注意事项:springboot版本使用2.1,不要使用最新版本的logstash依赖,过高版本,会出现启动报错,测试过5.3以及4.11版本,均可以启动正常,项目使用5.3

    2.logback-spring.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        <!--自定义日志输出参数-->
        <!--<conversionRule conversionWord="msg" converterClass="com.herenit.pharmacycloud.log.LogMessageConverter" />-->
        <!-- 控制台输出 -->
        <springProperty scope="context" name="logstash-server" source="spring.logstash.server"/>
        <springProperty scope="context" name="logstash-port" source="spring.logstash.port"/>
        <springProperty scope="context" name="logstash-service-id" source="spring.logstash.serviceId"/>
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>info</level>
            </filter>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="utf8">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
            </encoder>
        </appender>
        <!-- 按照每天生成日志文件 -->
       <!-- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                &lt;!&ndash;日志文件输出的文件名&ndash;&gt;
                <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
                &lt;!&ndash;日志文件保留天数&ndash;&gt;
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                &lt;!&ndash;格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符&ndash;&gt;
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}  - %msg%n</pattern>
            </encoder>
            &lt;!&ndash;日志文件最大的大小&ndash;&gt;
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>10MB</MaxFileSize>
            </triggeringPolicy>
        </appender>-->
    
        <!--输出到logstash的appender-->
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <param name="Encoding" value="UTF-8"/>
            <remoteHost>${logstash-server}</remoteHost>
            <port>${logstash-port}</port>
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
                <customFields>{"serviceId":"${logstash-service-id}"}</customFields>
                <includeMdcKeyName>startTime</includeMdcKeyName>
                <includeMdcKeyName>endTime</includeMdcKeyName>
                <includeMdcKeyName>requestRawJson</includeMdcKeyName>
                <includeMdcKeyName>responseRawJson</includeMdcKeyName>
                <includeMdcKeyName>responseTime</includeMdcKeyName>
                <includeMdcKeyName>url</includeMdcKeyName>
                <includeMdcKeyName>method</includeMdcKeyName>
                <includeMdcKeyName>path</includeMdcKeyName>
            </encoder>
    
        </appender>
        <!--配置异步日志输出-->
        <appender name="LOGSTASH-ASYN" class="ch.qos.logback.classic.AsyncAppender">
            <appender-ref ref="LOGSTASH"/>
        </appender>
    
        <!-- 日志输出级别 -->
        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="LOGSTASH-ASYN" />
            <!--<appender-ref ref="FILE" />-->
        </root>
    
    
    
    </configuration>

    application.yml

    spring:
    #应用名称
      application:
        name: test
      #日志配置
      logstash:
          server: 127.0.0.1
          port: 5506
          serviceId: service-test-dev

    说明:serviceId值,用于es创建对应的项目索引库,具体配置参考下方(logstash对应配置文件)

    input{
      tcp{
            mode => "server"
            host => "127.0.0.1"
            port => 5506
            codec => json_lines
        }
    }
    output{
         elasticsearch{
         hosts =>["127.0.0.1:9200"]
         index=>"%{serviceId}-%{+YYYY.MM.dd}.log"
    }
    }

    3.统一日志拦截(自定义日志输出字段)

    @Aspect
    @Order(1)
    @Component
    public class WebLogAspect {
    
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        ThreadLocal<LogTemplate> logJsonModel = new ThreadLocal<>();
    
    
        //定义项目请求拦截路径,一般是controller层
        @Pointcut("execution(public * com.pp.test.facade..*.*(..))")
        public void webLog() {
        }
    
    
    
        @Before("webLog()")
        public void doBefore(JoinPoint joinPoint) throws Throwable {
            //封装请求入参日志对象
            LogTemplate logTemplate = new LogTemplate();
            logTemplate.setStartTime(LocalDateTime.now());
            logTemplate.setResponseTime(System.currentTimeMillis());
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            // 记录下请求内容
            logTemplate.setUrl(request.getRequestURL().toString());
            //处理文件上传日志记录
            Object[] args = joinPoint.getArgs();
            Stream<?> stream = ArrayUtils.isEmpty(args) ? Stream.empty() : Arrays.stream(args);
            List<Object> logArgs = stream
                    .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
                    .collect(Collectors.toList());
            //过滤后序列化无异常
            String methodName = joinPoint.getSignature().getName();
                  logTemplate.setRequestRawJson(StringEscapeUtils.unescapeJavaScript(JSONObject.toJSONString(JSON.toJSONString(logArgs))));
                logTemplate.setMethod(methodName);
                logTemplate.setPath(joinPoint.getSignature().getDeclaringTypeName());
           
            logJsonModel.set(logTemplate);
        }
    
        /**
         * @Description:记录响应请求正常日志
         * @Param: [ret]
         * @Return: void
         */
        @AfterReturning(returning = "ret", pointcut = "webLog()")
        public void doAfterReturning(JoinPoint joinPoint,Object ret) throws Throwable {
            //过滤后序列化无异常
            String methodName = joinPoint.getSignature().getName();
          logJsonModel.get().setResponseRawJson(StringEscapeUtils.unescapeJavaScript(JSONObject.toJSONString(ret)));
                logJsonModel.get().setResponseTime(System.currentTimeMillis() - logJsonModel.get().getResponseTime());
                logJsonModel.get().setEndTime(LocalDateTime.now());
                addLogData();
                logger.info(logJsonModel.get().toString());
            
        }
    
    //自定义日志需要输入的字段
        private void addLogData() {
                MDC.put("startTime", logJsonModel.get().getStartTime().format(DateTimeFormatter.ofPattern(DateTimeUtils.DATE_TIME)));
                MDC.put("endTime", logJsonModel.get().getEndTime().format(DateTimeFormatter.ofPattern(DateTimeUtils.DATE_TIME)));
                MDC.put("requestRawJson", logJsonModel.get().getRequestRawJson());
                MDC.put("responseRawJson",logJsonModel.get().getResponseRawJson());
                MDC.put("responseTime", Long.toString(logJsonModel.get().getResponseTime()));
                MDC.put("url", logJsonModel.get().getUrl());
                MDC.put("method", logJsonModel.get().getMethod());
                MDC.put("path", logJsonModel.get().getPath());
        }
    
        /**
         * @Description:记录响应请求异常日志
         * @Param: [ex]
         * @Return: void
         */
        @AfterThrowing(throwing="ex",pointcut = "webLog()")
        public void afterThrowing(Exception  ex) {
            String errorCode = "";
            String msg = "";
            if (ex instanceof BusinessException) {
                BusinessException be = (BusinessException)ex;
                errorCode = be.getCode();
                msg = be.getMessage();
            } else if (ex instanceof MethodArgumentNotValidException) {
                MethodArgumentNotValidException be = (MethodArgumentNotValidException)ex;
                msg = be.getBindingResult().getAllErrors().stream()
                        .map(DefaultMessageSourceResolvable::getDefaultMessage)
                        .reduce((m1, m2) ->  m1 + ";" + m2)
                        .orElse("未获取到错误信息");
                errorCode = RespCode.FAILED.getCode();
            }else {
                errorCode = RespCode.FAILED.getCode();
                msg = ex.getMessage();
            }
    //        logger.error("异常code:"+errorCode+",异常信息:"+msg, e);
            JSONObject repJson=new JSONObject();
            repJson.put("errorCode",errorCode);
            repJson.put("errorMsg",msg);
            logJsonModel.get().setResponseRawJson(StringEscapeUtils.unescapeJavaScript(JSONObject.toJSONString(repJson)));
            logJsonModel.get().setResponseTime(System.currentTimeMillis() - logJsonModel.get().getResponseTime());
            logJsonModel.get().setEndTime(LocalDateTime.now());
            logJsonModel.get().setMessage(msg);
            addLogData();
    //        logger.error("异常code:"+errorCode+",异常信息:"+msg, ex);
            logger.info(logJsonModel.get().toString());
        }
    }
    

    4.问题以及总结

    针对自定义字段输入到日志格式中,想过重写相关的底层代码,也测试过,但是结果都不是本人想要的效果,

    net.logstash.logback.encoder.LogstashEncoder,通过重写改实现类,但是改类提供更改的方法有限,

    希望有大佬,针对这个问题提供宝贵经验。

    另外还存在一个问题,springboot启动的所有日志,也会一条一条输入到es中,这个就很烦,目前使用比较笨的方法,

    写了一个拦截器,过滤springboot项目的无关的启动日志;

    也希望针对这个问题,大佬们提供有效可行的建议

    展开全文
  • Java自定义日志输出文件日志的打印,在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别、打印形式和日志的输出路径。1 log4j输出多个...

    Java自定义日志输出文件

    日志的打印,在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别、打印形式和日志的输出路径。

    1 log4j输出多个自定义日志文件

    如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?

    先看一个常见的log4j.properties文件,它是在控制台和test.log文件中记录日志:

    1 log4j.rootLogger=DEBUG, stdout, logfile

    4

    5 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    7 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    9 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

    12

    13 log4j.appender.logfile=org.apache.log4j.RollingFileAppender

    15 log4j.appender.logfile.File=log/test.log

    17 log4j.appender.logfile.MaxFileSize=128MB

    19 log4j.appender.logfile.MaxBackupIndex=3

    21 log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

    23 log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n

    如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:

    private static Log logger1 = LogFactory.getLog("mylogger1");

    private static Log logger2 = LogFactory.getLog("mylogger2");

    log4j.properties中配置如下:

    1 log4j.logger.mylogger1=DEBUG,test12 log4j.appender.test1=org.apache.log4j.FileAppender3 log4j.appender.test1.File=log/test1.log4 log4j.appender.test1.layout=org.apache.log4j.PatternLayout5 log4j.appender.test1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n6

    7 log4j.logger.mylogger2=DEBUG,test28 log4j.appender.test2=org.apache.log4j.FileAppender9 log4j.appender.test2.File=log/test2.log10 log4j.appender.test2.layout=org.apache.log4j.PatternLayout11 log4j.appender.test2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n

    不同日志要使用不同的logger(如输出到test1.log的要用logger1.info("abc"))。

    还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:

    log4j.additivity. mylogger1 = false

    它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方了。

    但是这种方式有个小缺陷,那就是打印的日志中类名只能是mylogger或者mylogger2。

    2 动态配置路径

    若程序需要的日志路径需要不断的变化,而又不可能每次都去改配置文件,此时可以利用环境变量来解决。

    log4j的配置如下:

    1 log4j.rootLogger=DEBUG,INFOLOG,DEBUGLOG2

    3 #info log4 log4j.appender.INFOLOG =org.apache.log4j.DailyRollingFileAppender5 log4j.appender.INFOLOG.File= ${log.dir}/${log.info.file}6 log4j.appender.INFOLOG.DatePattern=.yyyy-MM-dd7 log4j.appender.INFOLOG.Threshold=INFO8 log4j.appender.INFOLOG.layout=org.apache.log4j.PatternLayout9 log4j.appender.INFOLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n

    11

    12 #debug log13 log4j.appender.DEBUGLOG =org.apache.log4j.RollingFileAppender14 log4j.appender.DEBUGLOG.File= ${log.dir}/${log.debug.file}15 log4j.appender.DEBUGLOG.Threshold=DEBUG16 log4j.appender.DEBUGLOG.MaxFileSize=128MB17 log4j.appender.DEBUGLOG.MaxBackupIndex=318 log4j.appender.DEBUGLOG.layout=org.apache.log4j.PatternLayout19 log4j.appender.DEBUGLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c.%M(%L) - %m%n

    此时,在使用log打印日志之前,需要利用System定义日志的输出路径和文件名的环境变量:

    System.setProperty(“log.dir”, logDir);

    System.setProperty(“log.info.file”, infoLogFileName);

    System.setProperty(“log.debug.file”, debugLogFileName);

    附:Pattern参数的格式含义

    %c 输出日志信息所属的类的全名

    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2013-8-19- 22:10:28

    %f 输出日志信息所属的类的类名

    %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行

    %m 输出代码中指定的信息,如log(message)中的message

    %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”

    %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推

    %r 输出自应用启动到输出该日志信息所耗费的毫秒数

    %t 输出产生该日志事件的线程名

    展开全文
  • 该笔记将记录:在 Nginx 中,如何自定义日志格式。 解决方案 在如下示例中,使用 log_format 指令,定义名为 compression 的日志格式,然后在 access_log 中通过 compression 引用: http { log_format ...
  • 自定义feign.Client代理类 import com.google.common.collect.Sets; import feign.Client; import feign.Request; import feign.Response; import feign.Util; import org.slf4j.Logger; import org.slf4j....
  • mybatis自定义日志

    2021-01-04 17:13:19
    都输出到日志文件中,就自定义一个日志类 输出日志的前提条件需要配置好前提配置好logback的相关配置 打印sql的方法有两个 1. (控制台会输出sql语句和执行sql的结果,但输出的日志文件没有sql语句和执行结果) ...
  • Logging自定义日志

    2021-05-17 16:53:13
    项目日志:从代码里面收集过来的,用来还原用户行为 日志打印原则:只打印关键信息(能够还原用户行为的关键信息) 自动化测试关键信息: 1、请求地址 2、请求参数 3、断言 ...三、创建日志格式:单独创建,
  • Nginx日志配置 设置access_log 设置error_log open_log_file_cache设置缓存 如何配置proxy_cache模块 Nginx日志配置 Nginx日志分为两种: access_log(访问日志)和error_log(错误日志)。 通过访问日志可以...
  • 在Linux系统中,messages、cron、secure等日志的默认的格式为:Dec 12 14:04:47我们更喜欢的格式为这样的:2019-12-12 14:12:19修改方法为,修改后重启rsyslog:vim/etc/rsyslog.conf#定义自己的本土化的时间格式$...
  • 要是想自定义日志需要新定义一个日志文件(多么有特色) 1.修改logs_xml.config文件来生成自己需要的日志 打开这个文件发现好长的注释说明,对于新手真的是一头雾水。又是翻文档又是找人问,才明白这个配置文件...
  • 本文作者:suxingrui ...版权声明:本文为原创文章,转载请注明出处。...使用Feign调用外部请求,默认输出的日志格式不符合个人的习惯,所以需要进行一定的扩展。 调查分析: Feign默认的日志输出使用f.
  • 注:Egg.js 缩写为 Egg背景组织为了更好的对各个业务的请求日志进行统一的分析,制定了统一的日志打印规范,比如:[time][processId][traceId][userid] Hello World....统一格式之后,业务现有业务的日志工...
  • 宝塔默认的日志格式比较简单,可能有些站长需要自定义日志格式,而不知道从何下手,其实这个就是简单的定义nginx的过程只是宝塔的nginx配置文件存放位置与一般nginx不一样宝塔存放nginx配置文件位置:/...
  • 自定义日志文件类

    2021-03-03 10:43:36
    }/*** 往日志文件中写一条日志信息 * 为了防止多线程同时操作(写)日志文件,造成文件”死锁”。使用synchronized关键字 *@paramlogMsg 日志消息*/publicsynchronizedvoidlog(String logMsg) {this.writer....
  • Log4j自定义日志输出

    2021-02-28 19:01:09
    前说一下业务需求:因代码当中调用了第三个接口,所以要对第三方接口单独记录日志,所以配置log4j指定此类的日志输出到指定的文件路径与文件上。不多说看源码:Java代码log4j.rootLogger=ERROR, stdout ,logfilelog4...
  • 自定义日志级别

    2020-12-28 15:35:37
    resources目录下创建logback.xml文件 <?xml version="1.0" encoding="UTF-8"?...--控制台日志颜色--> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.
  • 自定义SLF4J日志格式,超详细

    千次阅读 2021-04-27 19:52:01
    在springBoot中统一定义或切换日志,类似...日志归类输出,可在properties配置文件中,自定义输出格式以及输出路径## #指定日志输出级别,未指定的条件下springBoot会默认指定info级别(root)后面的级别 logging.
  • 为了方便,使用Logger自定义封装一些日志功能。 Logs日志类生成环境中使用了,很稳定,暂未发现什么问题。 创建文件夹及文件 <?php /** * laravel的日志类不够用,根据项目日志习惯二次封装Monolog日志类 */ ...
  • logback自定义日志配置

    2021-05-28 16:02:03
    Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,将xml放至 src/main/resource下面。 也可以使用...
  • java自定义日志输出

    2021-02-12 18:41:14
    public class LogUtil{/*** 将信息写入到日志*/public static boolean writeLog(String className,String ErrorInfo,String ErrorContent){String content=info(className, ErrorInfo, ErrorContent);File fileName ...
  • log4j自定义日志输出

    2021-02-28 19:01:09
    private LogUtil(Class c) { // 获取用户自定义环境变量 Map envMap = System.getenv(); String envPath = (String) envMap.get(OM_HOME); //获取系统分隔符 String separator = System.getProperty("file....
  • 自定义Log日志

    2021-04-22 12:16:28
    为什么需要日志Log日志的功能:1.了解系统运行情况2.记录用户的操作信息(记录用户传递了什么参数等)3.收集数据(记录请求响应请求等)PHP自带的日志系统php中有一个记录日志的函数:bool error_log ( string $message ...
  • 一、背景Linux系统自带的shell窗口操作记录文件.history,可以记录用户执行过的命令,但是存在不足的是,记录的日志文件易于被删除,或者信息量较少。有没有什么方式可以在各个Linux主机上留存shell窗口的操作记录,...
  • MybatisPlus自定义SQL日志打印

    千次阅读 2021-03-31 14:55:05
    大大加快了开发的速率,但是在日常工作中,还是会发现有一些不方便之处,那就是关于日志的打印,框架虽然也提供了日志打印,但是日志的排版等还是没有特别直观,这里我们自定义来实现sql的打印格式。 创建SQL拦截器 ...
  • 为了方便,使用Logger自定义封装一些日志功能。 Logs日志类实际项目中使用了两三年了,还是相对稳定。 <?php /** * laravel的日志类不够用,根据项目日志习惯二次封装Monolog日志类 */ namespace App\Utils; ...
  • Feign 自定义日志配置

    2021-12-05 09:27:28
    修改日志级别,包含4个不同级别,NONE,BASE,HEADERS,FULL 1. 基于配置文件yml feign: client: config: default: #这里default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 LoggerLevel: FULL ...
  • 最近在项目有个需求就是不同的日志类型打印到不同的文件中去 logback.xml文件: <appender name="test" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_PATH}/test/test....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 416,326
精华内容 166,530
关键字:

自定义日志格式