springboot项目日志记录访问客户端ip地址
生活随笔
收集整理的這篇文章主要介紹了
springboot项目日志记录访问客户端ip地址
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.背景
在我們項目開發中,很多時候需要記錄訪問ip地址,方便跟蹤操作日志定位是哪個機器訪問了我們的服務(逮住證據),或者根據ip做一些分析統計。
那么使用springboot自帶的logback如何記錄客戶端訪問ip呢?下面詳細說明。
2.重寫日志規則方法記錄ip
創建IPLogConfig類實現ClassicConverter類重寫convert方法獲取請求上下文返回ip,如下:
package com.bylz.api.config;import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.spi.ILoggingEvent; import com.bylz.api.utils.IpUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;/*** Author: lizhi* Date: 2021-10-11* Describe: 日志輸出ip配置*/ public class IPLogConfig extends ClassicConverter {@Overridepublic String convert(ILoggingEvent event) {RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();if (requestAttributes == null) {return "127.0.0.1";}HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();return IpUtils.getIpAddr(request);} }IpUtils工具類:
package com.bylz.api.utils;import com.google.common.base.Strings;import javax.servlet.http.HttpServletRequest;/*** @author lizhi* @version 1.0* @date 2021/8/31 11:33*/ public class IpUtils {private IpUtils(){}public static String getIpAddr(HttpServletRequest request) {String xIp = request.getHeader("X-Real-IP");String xFor = request.getHeader("X-Forwarded-For");if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) {//多次反向代理后會有多個ip值,第一個ip才是真實ipint index = xFor.indexOf(",");if (index != -1) {return xFor.substring(0, index);} else {return xFor;}}xFor = xIp;if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) {return xFor;}if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) {xFor = request.getHeader("Proxy-Client-IP");}if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) {xFor = request.getHeader("WL-Proxy-Client-IP");}if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) {xFor = request.getHeader("HTTP_CLIENT_IP");}if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) {xFor = request.getHeader("HTTP_X_FORWARDED_FOR");}if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) {xFor = request.getRemoteAddr();}return "0:0:0:0:0:0:0:1".equals(xFor) ? "127.0.0.1" : xFor;} }?3.配置logback-spring.xml打印ip
在日志配置xml文件中增加convert規則:
<!--配置規則類的位置--> <conversionRule conversionWord="ip" converterClass="com.bylz.api.config.IPLogConfig" />?在日志打印模板中獲取ip打印:
<property name="CONSOLE_LOG_PATTERN"value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%magenta(%ip) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>完整日志打印配置如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"><!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低于WARN的信息都不會輸出 --><!-- scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true --><!-- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 --><!-- debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。 --><contextName>logback</contextName><!-- name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。 --><property name="log.path" value="/data/apps/qcloud-api/log" /><!--配置規則類的位置--><conversionRule conversionWord="ip" converterClass="com.bylz.api.config.IPLogConfig" /><!-- 彩色日志 --><!-- 配置格式變量:CONSOLE_LOG_PATTERN 彩色日志格式 --><!-- magenta:洋紅 --><!-- boldMagenta:粗紅--><!-- cyan:青色 --><!-- white:白色 --><!-- magenta:洋紅 --><property name="CONSOLE_LOG_PATTERN"value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%magenta(%ip) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/><!--輸出到控制臺--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是為開發使用,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息--><!-- 例如:如果此處配置了INFO級別,則后面其他位置即使配置了DEBUG級別的日志,也不會被輸出 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><encoder><Pattern>${CONSOLE_LOG_PATTERN}</Pattern><!-- 設置字符集 --><charset>UTF-8</charset></encoder></appender><!--輸出到文件--><!-- 時間滾動輸出 level為 INFO 日志 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_info.log</file><!--日志文件輸出格式--><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>UTF-8</charset></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 每天日志歸檔路徑以及格式 --><fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天數--><maxHistory>15</maxHistory></rollingPolicy><!-- 此日志文件只記錄info級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 時間滾動輸出 level為 WARN 日志 --><appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_warn.log</file><!--日志文件輸出格式--><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>UTF-8</charset> <!-- 此處設置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天數--><maxHistory>15</maxHistory></rollingPolicy><!-- 此日志文件只記錄warn級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>warn</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 時間滾動輸出 level為 ERROR 日志 --><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_error.log</file><!--日志文件輸出格式--><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>UTF-8</charset> <!-- 此處設置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天數--><maxHistory>15</maxHistory></rollingPolicy><!-- 此日志文件只記錄ERROR級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--<logger>用來設置某一個包或者具體的某一個類的日志打印級別、以及指定<appender>。<logger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。name:用來指定受此logger約束的某一個包或者具體的某一個類。level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,如果未設置此屬性,那么當前logger將會繼承上級的級別。--><!--使用mybatis的時候,sql語句是debug下才會打印,而這里我們只配置了info,所以想要查看sql語句的話,有以下兩種操作:第一種把<root level="INFO">改成<root level="DEBUG">這樣就會打印sql,不過這樣日志那邊會出現很多其他消息第二種就是單獨給mapper下目錄配置DEBUG模式,代碼如下,這樣配置sql語句會打印,其他還是正常DEBUG級別:--><!--開發環境:打印控制臺--><springProfile name="dev"><!--可以輸出項目中的debug日志,包括mybatis的sql日志--><!--<logger name="com.bylz.api.dao" level="DEBUG" />--><!--<logger name="com.bylz.api.controller.feign" level="DEBUG" />--><!--root節點是必選節點,用來指定最基礎的日志輸出級別,只有一個level屬性level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默認是DEBUG可以包含零個或多個appender元素。--><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="WARN_FILE" /><appender-ref ref="ERROR_FILE" /></root></springProfile><!--測試環境:輸出到文件--><springProfile name="test"><!--可以輸出項目中的debug日志,包括mybatis的sql日志--><!--<logger name="com.bylz.api.dao" level="DEBUG" />--><!--<logger name="com.bylz.api.controller.feign" level="DEBUG" />--><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="WARN_FILE" /><appender-ref ref="ERROR_FILE" /></root></springProfile><!--生產環境:輸出到文件--><springProfile name="prod"><!--可以輸出項目中的debug日志,包括mybatis的sql日志--><!--<logger name="com.bylz.api.dao" level="DEBUG" />--><!--<logger name="com.bylz.api.controller.feign" level="DEBUG" />--><root level="INFO"><appender-ref ref="ERROR_FILE" /><appender-ref ref="WARN_FILE" /><appender-ref ref="INFO_FILE" /></root></springProfile></configuration>4.日志輸出如下
總結
以上是生活随笔為你收集整理的springboot项目日志记录访问客户端ip地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XP不能正常关机
- 下一篇: Visual Studio 2022下载