91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

logback怎么自定義日志存儲

發布時間:2021-08-30 13:43:25 來源:億速云 閱讀:356 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關logback怎么自定義日志存儲,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    logback自定義日志存儲

    1、配置lockback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration> 
     <property name="LOG_HOME" value="/wzwsq-log" />
     <property name="APP_NAME" value="wzwsq" />
     
     <!-- 控制臺輸出 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
       <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{address} %-5level %logger{50} - %msg%n</pattern>
      </encoder>
     </appender>
     
     <!-- 按照每天生成日志文件 -->
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
       <!--日志文件輸出的文件名 -->
       <FileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern>
       <!--日志文件保留天數 -->
       <MaxHistory>10</MaxHistory>
      </rollingPolicy>
      <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
       <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
       <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{address} %-5level %logger{50} - %msg%n</pattern>
       <!--<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> -->
      </encoder>
     </appender>
     <!--連接數據庫配置 class:日志保存操作類 -->
     <appender name="db_classic_mysql_pool" class="wzwsq.config.LogDBAppender">
      <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
       <dataSource class="org.apache.commons.dbcp.BasicDataSource">
        <driverClassName>com.mysql.jdbc.Driver</driverClassName>
        <url>jdbc:mysql://localhost:3306/wzwsq?serverTimezone=GMT%2B8&amp;useSSL=false&amp;characterEncoding=utf8</url>
        <username>root</username>
        <password>123456</password>
       </dataSource>
      </connectionSource>
     </appender>
     
     <!-- 日志輸出級別 -->
     <root level="info">
      <appender-ref ref="STDOUT" />
      <appender-ref ref="FILE" />
            <!--添加自定義操作配置-->
      <appender-ref ref="db_classic_mysql_pool" />
     </root>
     
    </configuration>

    2、配置自定義日志操作類

    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.db.DBAppenderBase;
    import com.alibaba.fastjson.JSONObject;
    import wzwsq.model.IpInfo;     //自定義IP對象
    import wzwsq.model.UsersModel; //自定義用戶對象
    import wzwsq.util.Constant;    //自定義常量對象
    import wzwsq.util.WebUtils;    //自定義Web工具對象
    import org.springframework.context.annotation.Configuration;
     
    import java.lang.reflect.Method;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Timestamp;
     
    /**
     * @ClassName LogDBAppender
     * @Description: 自定義日志保存至數據庫
     * @Author wzwsq
     * @Date 2020/12/10
     * @Version V1.0
     **/
    @Configuration
    public class LogDBAppender extends DBAppenderBase<ILoggingEvent> {
        protected static final Method GET_GENERATED_KEYS_METHOD;
        //插入sql
        protected String insertSQL;
     
        //自定義存儲字段
        /**
         * menu_type:操作類型,指的是菜單ID
         * record_id:相關操作對象的ID
         * operation_content:操作內容,自定義編輯
         * add_id:操作人ID
         * add_time:操作時間
         * ip:根據IP對應城市
         * city:ip所屬城市
         * ua:瀏覽器信息
         * */
        static final int MENU_TYPE = 1;
        static final int RECORD_ID = 2;
        static final int OPERATION_CONTENT = 3;
        static final int ADD_ID = 4;
        static final int ADD_TIME = 5;
        static final int IP = 6;
        static final int CITY = 7;
        static final int UA = 8;  
        static final StackTraceElement EMPTY_CALLER_DATA = CallerData.naInstance(); 
        static {
            // PreparedStatement.getGeneratedKeys() method was added in JDK 1.4
            Method getGeneratedKeysMethod;
            try {
                // the
                getGeneratedKeysMethod = PreparedStatement.class.getMethod("getGeneratedKeys", (Class[]) null);
            } catch (Exception ex) {
                getGeneratedKeysMethod = null;
            }
            GET_GENERATED_KEYS_METHOD = getGeneratedKeysMethod;
        }
     
        @Override
        public void start() {
            // 將寫好的sql語句賦值給insertSQL
            insertSQL = buildInsertSQL();
            super.start();
        }
     
        // 自己寫新增sql語句
        private static String buildInsertSQL() {
            return "INSERT INTO `operation_log`" +
                    "(" +
                    "`menu_type`,`record_id`," +
                    "`operation_content`,`add_id`," +
                    "`add_time`,`ip`," +
                    "`city`,`ua`" +
                    ")" +
                    "VALUES (?,?,?,?,?,?,?,?)";
        }
     
        @Override
        protected Method getGeneratedKeysMethod() {
            return GET_GENERATED_KEYS_METHOD;
        }
     
        @Override
        protected String getInsertSQL() {
            return insertSQL;
        }
     
        /**
         * 主要修改的方法
         *
         * @param stmt
         * @param event
         * @throws SQLException
         */
        private void bindLoggingEventWithInsertStatement(PreparedStatement stmt, ILoggingEvent event) throws SQLException {
            // event.getFormattedMessage() 日志打印內容
            String message = event.getFormattedMessage();
            // 如果只想存儲自己打印的日志,可以這樣寫日志:
            // logger.info("'MENU_TYPE': '{}','RECORD_ID': '{}','OPERATION_CONTENT': '{}'",XXX,XXX,XXX)
            //判斷當前日志信息是否屬于自定義類型
            int MENU_TYPE_FLAG=message.indexOf("MENU_TYPE");
            int RECORD_ID_FLAG=message.indexOf("RECORD_ID");
            int OPERATION_CONTENT_FLAG=message.indexOf("OPERATION_CONTENT");
            if(MENU_TYPE_FLAG>0&&RECORD_ID_FLAG>0&&OPERATION_CONTENT_FLAG>0){
                //截取用戶自定義的日志信息
                JSONObject jsonObject =JSONObject.parseObject(message);
                String menuType=jsonObject.get("MENU_TYPE").toString();
                String recordId=jsonObject.get("RECORD_ID").toString();
                String operationContent=jsonObject.get("OPERATION_CONTENT").toString();
                //獲取當前使用系統的用戶對象、IP、CITY、UA
                UsersModel usersModel=WebUtils.getUser();//用戶登錄對象
                IpInfo ipInfo=(IpInfo)WebUtils.getSession().getAttribute(Constant.IP_INFO);//用戶登錄IP信息
                String ip=ipInfo.getIp();
                String city=ipInfo.getCity();
                String ua=ipInfo.getUa();
     
                stmt.setString(MENU_TYPE, menuType);
                stmt.setString(RECORD_ID, recordId);
                stmt.setString(OPERATION_CONTENT, operationContent);
                stmt.setString(ADD_ID,usersModel.getId().toString());
                stmt.setTimestamp(ADD_TIME, new Timestamp(event.getTimeStamp()));
                stmt.setString(IP, ip);
                stmt.setString(CITY,city==null?"":city.toString());
                stmt.setString(UA, ua==null?"":ua.toString());
            }
        }
     
        @Override
        protected void subAppend(ILoggingEvent eventObject, Connection connection, PreparedStatement statement) throws Throwable {
            bindLoggingEventWithInsertStatement(statement, eventObject);
            // This is expensive... should we do it every time?
            int updateCount = statement.executeUpdate();
            if (updateCount != 1) {
                addWarn("Failed to insert loggingEvent");
            }
        }
     
        @Override
        protected void secondarySubAppend(ILoggingEvent eventObject, Connection connection, long eventId) throws Throwable {
        }
    }

    3、調用方法

    private static Logger logger = LoggerFactory.getLogger(UsersController.class);
    logger.info("'MENU_TYPE': '{}','RECORD_ID': '{}','OPERATION_CONTENT': '{}'",XXX,XXX,XXX);

    注意事項:在logback.xml中appender標簽一定的寫在root標簽之前

    使用logback進行系統日志記錄

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.1.11</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.1.11</version>
            </dependency>

    logback-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    	<property name="log.base" value="/data1/logs/applogs/dt-mapping-api" />
    	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    		<encoder>
    			<pattern>%date %.-5level %class{100} ----------->> %msg%n</pattern>
    		</encoder>
    	</appender>
     
    	<appender name="logfile"
    		class="ch.qos.logback.core.rolling.RollingFileAppender">
    		
    		<file>${log.base}/default.log</file>
             <!-- 配置日志所生成的目錄以及生成文件名的規則 在logs/mylog-2017-06-31.0.log.zip -->       
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.base}.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
                <!-- 如果按天來回滾,則最大保存時間為30天,30天之前的都將被清理掉 -->
                <maxHistory>30</maxHistory>
                <!-- 日志總保存量為10GB -->
                <totalSizeCap>10 GB</totalSizeCap>
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!--文件達到 最大128MB時會被壓縮和切割 -->
                    <maxFileSize>128 MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
    		<encoder>
    			<pattern>%date [%thread] %.-5level %class{25} - %msg%n</pattern>
    		</encoder>
    	</appender>
     
    	<appender name="errorfile"
    		class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<file>${log.base}/error.log</file>
    		<filter class="ch.qos.logback.classic.filter.LevelFilter">  
    		    <level>ERROR</level>  
    		    <onMatch>ACCEPT</onMatch>  
    		    <onMismatch>DENY</onMismatch>  
    		</filter> 
    		<!-- 配置日志所生成的目錄以及生成文件名的規則 在logs/mylog-2017-06-31.0.log.zip -->       
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.base}/error.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
                <!-- 如果按天來回滾,則最大保存時間為30天,30天之前的都將被清理掉 -->
                <maxHistory>30</maxHistory>
                <!-- 日志總保存量為10GB -->
                <totalSizeCap>10 GB</totalSizeCap>
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!--文件達到 最大128MB時會被壓縮和切割 -->
                    <maxFileSize>128 MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
    		<encoder>
    			<pattern>%date [%thread] %.-5level %class{25} - %msg%n</pattern>
    		</encoder>
    	</appender>
     
    	<logger name="com.netflix.curator" level="OFF" />
    	<root level = "DEBUG">
    		<appender-ref ref="errorfile" />
    		<appender-ref ref="logfile" />
    		<appender-ref ref="stdout" />
    	</root>
     
    </configuration>
    private final static Logger logger = LoggerFactory.getLogger(Application.class);
            logger.info("批次號: {}",111111111111);
    logger.error("xxx失敗: {}",e);

    關于“logback怎么自定義日志存儲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    玛沁县| 威宁| 黄骅市| 桦南县| 涞源县| 肃南| 九龙坡区| 衡南县| 海兴县| 靖江市| 遵义县| 方山县| 成都市| 咸阳市| 来安县| 老河口市| 大邑县| 昆明市| 碌曲县| 新巴尔虎右旗| 东方市| 买车| 都匀市| 离岛区| 松原市| 军事| 民勤县| 普宁市| 凤台县| 佳木斯市| 手机| 清远市| 德惠市| 岗巴县| 河南省| 多伦县| 偃师市| 外汇| 西乌珠穆沁旗| 天祝| 长治县|