0
点赞
收藏
分享

微信扫一扫

SpringBoot日志输出控制


配置输出控制台

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>

<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss} [%X{RequestId}] %-5level %logger{50}:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>

<!-- 默认的日志配置 -->
<root level="debug">
<!--输出控制台-->
<appender-ref ref="console"/>
</root>

</configuration>

配置输出日志文件

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>

<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/app/logs"/>

<!-- 按照每天生成日志文件 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只打印ERROR级别的日志 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>
${LOG_HOME}/%d{yyyy-MM}/%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件总保留天数-->
<MaxHistory>30</MaxHistory>
<!--日志总保存量为10GB -->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!-- 单个文件最大-->
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss} [%X{RequestId}] %-5level %logger{50}:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</Pattern>
</encoder>
</appender>

<!-- 默认的日志配置 -->
<root level="debug">
<!--输入到日志文件-->
<appender-ref ref="file"/>
</root>
</configuration>

配置输出ES

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--读取Spring配置文件的值-->
<springProperty scope="context" name="SPRING_PROFILES_ACTIVE" source="spring.profiles.active"/>
<springProperty scop="context" name="SPRING_APPLICATION_NAME" source="spring.application.name" defaultValue=""/>

<appender name="elastic" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender">
<url>http://elasticsearch.y8zh.com/_bulk</url>
<index>logback-${SPRING_PROFILES_ACTIVE}-${SPRING_APPLICATION_NAME}-%date{yyyy-MM}</index>
<type>app-log</type>
<!-- <loggerName>es-logger</loggerName> <!– optional –>-->
<errorLoggerName>es-error-logger</errorLoggerName> <!-- optional -->
<connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) -->
<errorsToStderr>false</errorsToStderr> <!-- optional (default false) -->
<includeCallerData>false</includeCallerData> <!-- optional (default false) -->
<logsToStderr>false</logsToStderr> <!-- optional (default false) -->
<maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) -->
<maxRetries>3</maxRetries> <!-- optional (default 3) -->
<readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) -->
<sleepTime>250</sleepTime> <!-- optional (in ms, default 250) -->
<rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) -->
<includeMdc>false</includeMdc> <!-- optional (default false) -->
<maxMessageSize>1000</maxMessageSize> <!-- optional (default -1 -->
<authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication"/> <!-- optional -->
<properties>
<property>
<name>host</name>
<value>${HOSTNAME}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>route</name>
<value>%X{Route}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>method</name>
<value>%X{Method}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>httpCode</name>
<value>%X{HttpCode}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>requestId</name>
<value>%X{RequestId}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>requestIp</name>
<value>%X{RequestIp}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>severity</name>
<value>%level</value>
</property>
<property>
<name>stacktrace</name>
<value>%ex</value>
</property>
<property>
<name>logger</name>
<value>%logger:%line</value>
</property>
</properties>
<headers>
<header>
<name>Content-Type</name>
<value>application/json</value>
</header>
</headers>
</appender>

<!-- 默认的日志配置 -->
<root level="debug">
<!--控制环境输出-->
<springProfile name="dev | fat | uat | pro">
<!--输出到ES-->
<appender-ref ref="elastic"/>
</springProfile>
</root>
</configuration>

注意:%X{Route}、%X{Method}、%X{HttpCode}、%X{RequestId}、%X{RequestIp},这些值可以通过下面这种方式得到!

@Component
public class MDCFilter implements Filter {
/**
* 设置响应头,响应头名字(惯例是大写)
*/
private static final String REQUEST_ID_HEADER = "RequestId";
/**
* 设置到 MDC 里的key(惯例使用小驼峰,为了统一这里也用大写)
*/
private static final String REQUEST_ID = "RequestId";
private static final String ROUTE = "Route";
private static final String METHOD = "Method";
@Value("${spring.application.name}")
private String _applicationName;

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;

String requestId = httpRequest.getHeader(REQUEST_ID_HEADER);
if (requestId == null) {
requestId = "111111111111";
}

requestId = "111111111111";

// 还有更加准确的方法
String ip = getRequestSourceIp(httpRequest);

MDC.put(REQUEST_ID, requestId);
MDC.put(ROUTE, "-");
MDC.put(METHOD, httpRequest.getMethod());
MDC.put("RequestIp", ip);
httpResponse.setHeader(REQUEST_ID_HEADER, requestId);

try {
filterChain.doFilter(httpRequest, httpResponse);
} finally {
MDC.clear();
}
}

/**
* 获取请求来源的IP,可以适应前置部署有Nginx等反向代理软件等的情况. HTTP_CLIENT_IP 无法伪造,所以放在第一个

*
* @param request
* @return
* @author Stone
*/
public static String getRequestSourceIp(HttpServletRequest request) {
String ip = request.getHeader("HTTP_CLIENT_IP");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED");
}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_FORWARDED");
}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-FORWARDED-FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip.equals("0:0:0:0:0:0:0:1")) {
ip = "127.0.0.1";
}
return ip;
}
}

排除日志

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!-- 排除的日志输出类 -->
<logger name="Validator" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="springfox" level="warn"/>
<logger name="org.hibernate" level="warn"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="com.baomidou" level="warn"/>
<logger name="io.netty" level="warn"/>
<logger name="io.lettuce" level="warn"/>
<logger name="com.zaxxer.hikari" level="warn"/>
<logger name="org.jboss" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="com.alibaba.nacos" level="warn"/>
<logger name="org.elasticsearch" level="warn"/>
<logger name="org.springframework.data" level="error"/>
<logger name="com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder" level="error"/>
<logger name="org.springframework.boot.web.embedded.tomcat.TomcatWebServer" level="INFO"/>
</configuration>

完整配置

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--读取Spring配置文件的值-->
<springProperty scope="context" name="SPRING_PROFILES_ACTIVE" source="spring.profiles.active"/>
<springProperty scop="context" name="SPRING_APPLICATION_NAME" source="spring.application.name" defaultValue=""/>

<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/app/logs"/>

<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss} [%X{RequestId}] %-5level %logger{50}:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>


<!-- 按照每天生成日志文件 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只打印ERROR级别的日志 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>
${LOG_HOME}/%d{yyyy-MM}/%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件总保留天数-->
<MaxHistory>30</MaxHistory>
<!--日志总保存量为10GB -->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!-- 单个文件最大-->
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss} [%X{RequestId}] %-5level %logger{50}:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</Pattern>
</encoder>
</appender>

<appender name="elastic" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender">
<url>http://elasticsearch.y8zh.com/_bulk</url>
<index>logback-${SPRING_PROFILES_ACTIVE}-${SPRING_APPLICATION_NAME}-%date{yyyy-MM}</index>
<type>app-log</type>
<!-- <loggerName>es-logger</loggerName> <!– optional –>-->
<errorLoggerName>es-error-logger</errorLoggerName> <!-- optional -->
<connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) -->
<errorsToStderr>false</errorsToStderr> <!-- optional (default false) -->
<includeCallerData>false</includeCallerData> <!-- optional (default false) -->
<logsToStderr>false</logsToStderr> <!-- optional (default false) -->
<maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) -->
<maxRetries>3</maxRetries> <!-- optional (default 3) -->
<readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) -->
<sleepTime>250</sleepTime> <!-- optional (in ms, default 250) -->
<rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) -->
<includeMdc>false</includeMdc> <!-- optional (default false) -->
<maxMessageSize>1000</maxMessageSize> <!-- optional (default -1 -->
<authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication"/> <!-- optional -->
<properties>
<property>
<name>host</name>
<value>${HOSTNAME}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>route</name>
<value>%X{Route}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>method</name>
<value>%X{Method}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>httpCode</name>
<value>%X{HttpCode}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>requestId</name>
<value>%X{RequestId}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>requestIp</name>
<value>%X{RequestIp}</value>
<allowEmpty>false</allowEmpty>
</property>
<property>
<name>severity</name>
<value>%level</value>
</property>
<property>
<name>stacktrace</name>
<value>%ex</value>
</property>
<property>
<name>logger</name>
<value>%logger:%line</value>
</property>
</properties>
<headers>
<header>
<name>Content-Type</name>
<value>application/json</value>
</header>
</headers>
</appender>

<!-- 排除的日志输出类 -->
<logger name="Validator" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<logger name="springfox" level="warn"/>
<logger name="org.hibernate" level="warn"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="com.baomidou" level="warn"/>
<logger name="io.netty" level="warn"/>
<logger name="io.lettuce" level="warn"/>
<logger name="com.zaxxer.hikari" level="warn"/>
<logger name="org.jboss" level="warn"/>
<logger name="org.mybatis" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="com.alibaba.nacos" level="warn"/>
<logger name="org.elasticsearch" level="warn"/>
<logger name="org.springframework.data" level="error"/>
<logger name="com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder" level="error"/>
<logger name="org.springframework.boot.web.embedded.tomcat.TomcatWebServer" level="INFO"/>

<!-- 默认的日志配置 -->
<root level="debug">

<!--输出控制台-->
<appender-ref ref="console"/>

<!--输入到日志文件-->
<!--<appender-ref ref="file"/>-->

<!--控制环境输出-->
<springProfile name="dev | fat | uat | pro">
<!--输出到ES-->
<appender-ref ref="elastic"/>
</springProfile>

</root>
</configuration>

测试代码日志输出

@Slf4j
@RestController
@RequestMapping({"/"})
public class ControllerTest {

@GetMapping("log")
public String log(){
log.info("===>loglogloglog");
return "sss";
}

}

SpringBoot日志输出控制_xml


举报

相关推荐

0 条评论