1. 程式人生 > >log4j2.xml配置日誌寫入資料庫

log4j2.xml配置日誌寫入資料庫

之前寫過通過logback.xml配置將日誌寫入資料庫的文章,本章中公司專案中使用的則是log4j2.xml,本來以為很容易實現,結果費了一下午時間才搞定,記錄一下。

一、在本地新建庫auge_log,在該庫中新建表error_log

DROP TABLE IF EXISTS `error_log`;
CREATE TABLE `error_log` (
  `log_id` int(20) NOT NULL AUTO_INCREMENT,
  `class` varchar(200) DEFAULT NULL,
  `method` varchar(100) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `log_level` varchar(50) DEFAULT NULL,
  `msg` varchar(4000) DEFAULT NULL,
  PRIMARY KEY (`log_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、在log4j2.xml配置寫入資料庫的資訊:JDBC部分

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        </Console>
        <!-- 按天第天備份一個日誌 -->
        <RollingFile name="saveFile" fileName="${sys:catalina.home}/logs/beanspark/auge.log"
                     filePattern="${sys:catalina.home}/logs/beanspark/auge_%d{yyyy-MM-dd}_%i.log">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
            <Policies>
                <!-- 每天更新一次 每個檔案最大活躍大小 512MB 最多備份20個檔案 -->
                <TimeBasedTriggeringPolicy modulate="true" interval="1" />
                <SizeBasedTriggeringPolicy size="512MB" />
            </Policies>
            <!-- 最多備份20個 -->
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
        <!-- 按天第天備份一個日誌 -->
        <RollingFile name="XdyjError" fileName="${sys:catalina.home}/logs/beanspark/auge_error.log"
                     filePattern="${sys:catalina.home}/logs/beanspark/auge_error_%d{yyyy-MM-dd}_%i.log">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
            <Policies>
                <!-- 每天更新一次 每個檔案最大活躍大小 128MB 最多備份20個檔案 -->
                <TimeBasedTriggeringPolicy modulate="true" interval="1" />
                <SizeBasedTriggeringPolicy size="128MB" />
            </Policies>
            <!-- 最多備份20個 -->
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
        <!--寫入資料庫配置,在Logger中設定日誌級別為error-->
        <JDBC name="databaseAppender" tableName="error_log">
            <ConnectionFactory class="com.xiaodou.park.util.ConnectionFactory" method="getDataSourceConnection" />
            <Column name="class" pattern="%c" />
            <Column name="method" pattern="%M" />
            <Column name="log_level" pattern="%p" />
            <Column name="msg" pattern="%msg"/>
            <Column name="create_time" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}"/>
        </JDBC>
    </Appenders>

    <Loggers>
        <logger name="com.xiaodou.park" level="trace" additivity="false">
            <appender-ref ref="XdyjError" level="error"/>
            <appender-ref ref="saveFile" level="info"/>
            <appender-ref ref="Console" level="debug"/>
            <appender-ref ref="databaseAppender" level="error"/>
        </logger>
        <Root level="error">
            <!-- Only events at DIAG level or more specific are sent to the console. -->
            <appenderRef ref="XdyjError"/>
            <appenderRef ref="saveFile"/>
            <appender-ref ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

三、新建資料庫連線類,使用的是druid資料來源(主要是專案中與資料庫的連線使用的就是druid資料來源)

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import com.google.common.collect.MapConstraints;
import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.ErrorCode;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class ConnectionFactory extends JDBCAppender {
    /* Druid資料來源 */
    private DruidDataSource dataSource;
    private static ConnectionFactory connectionFactory;
    public ConnectionFactory() {
        super();
    }

    @Override
    protected void closeConnection(Connection con) {
        try {
            /* 如果資料庫連線物件不為空和沒有被關閉的話,關閉資料庫連線 */
            if (con != null && !con.isClosed())
                con.close();
        } catch (SQLException e) {
            errorHandler.error("Error closing MyJDBCAppender.closeConnection() 's connection", e, ErrorCode.GENERIC_FAILURE);
        }
    }

    @Override
    protected Connection getConnection() throws SQLException {
        String className = "com.mysql.jdbc.Driver";
        String connUrl = "jdbc:mysql://localhost:3306/auge_log?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true";
        String uname = "root";
        String psw = "123456";
        Properties result = new Properties();
        result.put("driverClassName", className);
        result.put("url", connUrl);
        result.put("username", uname);
        result.put("password", psw);

        /* 其他配置 自然你也可以自己寫property 然後獲取set */
        result.put("maxActive", "30");
        result.put("minIdle", "3");

        try {
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(result);
        } catch (Exception e) {
            /* Druid資料庫源物件產生失敗後,取消初始化 */
            try {
                uninitialize();
            } catch (Exception e2) {
            }
        }

        return dataSource.getConnection();
    }

    /* 取消初始化 */
    public void uninitialize() {
        try {
            if (dataSource != null)
                dataSource.close();
        } catch (Exception e) {
        } finally {
            super.close();
        }
    }
    public static Connection getDataSourceConnection() throws SQLException {
        if (connectionFactory==null){
            connectionFactory = new ConnectionFactory();
        }
        return connectionFactory.getConnection();
    }

}

四、在需要記錄的方法裡新增日誌記錄。

程式碼部分省略,若錄入資料庫為error級別,則只有logger.error的日誌會被儲存到資料庫。

@Controller
@RequestMapping("/admin")
public class AdminController {
    private static Logger logger = LogManager.getLogger(AdminController.class);
    @RequestMapping(value = "/login", method = {RequestMethod.POST}, produces = MEDIATYPE_CHARSET_JSON_UTF8)
    @ResponseBody
    public String login(HttpServletRequest request,String name,String password) {
        logger.info("管理員嘗試登陸: name = " + name);
        try {
            if (Strings.isNullOrEmpty(name) || Strings.isNullOrEmpty(password)) {
                logger.info("使用者名稱或密碼不能為空!");
            }
            AugeAdmin admin = adminService.loginByUesrnameAndPassword(name, md5Pwd);
            if (admin == null) {
                logger.error("使用者名稱或密碼錯誤");
            }
        } catch (Exception e) {
	    logger.error(e.getMessage());
            e.printStackTrace();	
        }
        return "";
    }
}

五、執行程式碼,密碼故意輸錯,檢視資料庫。

附:log4j2.xml配置解析

配置檔案節點解析:
1.根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).
status用來指定log4j本身的列印日誌的級別。monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s。
2.Appenders節點,常見的有三種子節點:Console、RollingFile、File,本章中還使用了JDBC節點。
Console節點用來定義輸出到控制檯的Appender。
屬性
name:指定Appender的名字。
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置預設:SYSTEM_OUT。
子節點
PatternLayout:輸出格式,不設定預設為:%m%n。
格式舉例:<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
File節點用來定義輸出到指定位置的檔案的Appender。
屬性
name:指定Appender的名字。
fileName:指定輸出日誌的目的檔案帶全路徑的檔名。
子節點
PatternLayout:輸出格式,不設定預設為:%m%n。
RollingFile節點用來定義超過指定大小自動刪除舊的建立新的的Appender。
屬性
name:指定Appender的名字。
fileName:指定輸出日誌的目的檔案帶全路徑的檔名。
filePattern:指定新建日誌檔案的名稱格式。
子節點
PatternLayout:輸出格式,不設定預設為:%m%n。
Policies:指定滾動日誌的策略,就是什麼時候進行新建日誌檔案輸出日誌。基於時間的觸發策略。該策略主要是完成周期性的log檔案封存工作。
有兩個引數:interval,integer型,指定兩次封存動作之間的時間間隔。單位:以日誌的命名精度來確定單位,比如yyyy-MM-dd-HH 單位為小時,yyyy-MM-dd-HH-mm 單位為分鐘
modulate,boolean型,說明是否對封存時間進行調製。若modulate=true,則封存時間將以0點為邊界進行偏移計算。
比如,modulate=true,interval=4hours,那麼假設上次封存日誌的時間為03:00,則下次封存日誌的時間為04:00,之後的封存時間依次為08:00,12:00,16:00
Policies的子節點
TimeBasedTriggeringPolicy:基於時間的滾動策略,interval屬性用來指定多久滾動一次,預設是1 hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那麼第一次滾動是在4am,接著是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:基於指定檔案大小的滾動策略,size屬性用來定義每個日誌檔案的大小.
DefaultRolloverStrategy:用來指定同一個資料夾下最多有幾個日誌檔案時開始刪除最舊的,建立新的(通過max屬性)。
JDBC節點用來配置日誌輸出到資料庫
屬性
name:指定Appender的名字。
tableName:日誌儲存表的名稱。
子節點
ConnectionFactory:兩個屬性class:連線庫的類,method:類中的連線方法。
Column:資料庫表字段。 name:欄位名稱。pattern:寫入值。isEventTimestamp:日期格式是否使用時間戳,不和pattern一起出現。
3.Loggers節點,常見的有兩種:Root和Logger.
Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼就會預設使用該Root日誌輸出
level:日誌輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節點,用來指定該日誌輸出到哪個Appender.
Logger節點用來單獨指定日誌的形式,比如要為指定包下的class指定不同的日誌級別等。
level:日誌輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
AppenderRef:Logger的子節點,用來指定該日誌輸出到哪個Appender,如果沒有指定,就會預設繼承自Root.如果指定了,那麼會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設定Logger的additivity="false"只在自定義的Appender中進行輸出。

日誌level級別定義:
All:最低等級的,用於開啟所有日誌記錄.
Trace:是追蹤,就是程式推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設定最低日誌級別不讓他輸出.
Debug:指出細粒度資訊事件對除錯應用程式是非常有幫助的.
Info:訊息在粗粒度級別上突出強調應用程式的執行過程.
Warn:輸出警告及warn以下級別的日誌.
Error:輸出錯誤資訊日誌.
Fatal:輸出每個嚴重的錯誤事件將會導致應用程式的退出的日誌.
OFF:最高等級的,用於關閉所有日誌記錄.

自定義格式:
%t:執行緒名稱
%p:日誌級別
%c:日誌訊息所在類名
%m:訊息內容
%M:輸出執行方法
%d:發生時間,%d{yyyy-MM-dd HH:mm:ss.SSS}
%x: 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。
%L:程式碼中的行數
%n:換行

相關推薦

log4j2.xml配置日誌寫入資料庫

之前寫過通過logback.xml配置將日誌寫入資料庫的文章,本章中公司專案中使用的則是log4j2.xml,本來以為很容易實現,結果費了一下午時間才搞定,記錄一下。 一、在本地新建庫auge_log,在該庫中新建表error_log DROP TABLE IF EXIS

SpringBoot配置log4j2的JdbcAppender日誌寫入資料庫,可定義哪些日誌寫入

import javax.annotation.PostConstruct; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Appender; import org.apache.loggin

自定義註解+springMVC配置攔截器記錄使用者操作的日誌.(寫入資料庫)

springMVC掃包下的分支配置檔案, 注入攔截器 攔截器的內容: (監聽儲存日誌資訊) @SuppressWarnings({"unchecked","rawtypes"}) public class CommContextInterceptor implemen

log4j2.xml配置使用

jar包: log4j-api-2.10.0.jar log4j-core-2.10.10.jar log4j-1.2-api-2.10.0.jar log4j-slf4j-impl-2.10.10.jar slf4j-api-1.7.25.jar 使用: public class AAA

封裝日誌寫入資料庫

建立對應得日誌實體類, import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatis

log4j2.xml配置檔案元素解析

log4j2.xml配置檔案元素解析 配置檔案展示 log4j2配置檔案整體結構 對於Appender的理解 對於Logger的理解 Appender的常用的實現類有: 標籤詳解及可包含

通過xml配置來實現資料庫的批量修改一

需求來源 近期由於專案的圖片伺服器遷移導致大量寫死在資料庫中圖片路徑需要修改。 實現思路 通過百度瞭解到可以通過mysql的REPLACE函式來進行區域性替換資料內容,類似這樣的語句: "UPDATE "+tableName+" SET

log4j2自定義配置檔案位置和檔名(附log4j2.xml配置例項)

前言 我們使用log4j2一般做法是將log4j2.xml檔案放在資原始檔夾根目錄。對於有強迫症的開發者來說,我更喜歡在資原始檔夾下新建包或資料夾,然後把配置檔案放在裡面。本部落格將介紹如何自定義log4j2.xml檔案的位置和檔名。 web.xml配置

Log4j2.xml配置詳解

<?xml version="1.0" encoding="UTF-8"?> <!-- status=debug 可以檢視log4j的裝配過程 --> <configuration status="off" monitorInterva

NHibernate學習之二——.cfg.xml配置大全(資料庫連線配置

一、sql2000/2005.cfg.xml <?xml version="1.0" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session

springboot之logback(二):將日誌寫入資料庫

上一節講了標準日誌輸出到檔案中,本節講解將日誌寫入資料庫,最主要的核心類就是DBAppender。我使用的MySQL資料庫,建立auge_log資料庫,執行以下內容建表。BEGIN; DROP TABLE IF EXISTS logging_event_property; D

Spring中applicationContext.xml配置檔案中資料庫資料來源配置

<!-- 標頭檔案,主要注意一下編碼 --> <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework

log4j2.xml 配置樣例

<?xml version="1.0" encoding="UTF-8"?> <Configuration s

l配置log4j完成日誌輸出與配置檔案log4j2.xml詳解

一、配置檔案節點解析    (1)根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger). status用來指定log4j本身的列印日誌的級別.

關於log4j2xml配置,以及不同級別日誌輸出到不同日誌檔案

例如,考慮下如下的常見場景:WEB應用,我們不希望把log4j2.xml打包到自己的jar檔案中(這樣修改log4j2的配置就麻煩了),也不希望把log4j2.xml放到WEB-INF/classes下面(不希望使用者隨便操作WEB-INF下的檔案),那我們可以

log4j2.xml配置文件

IT mismatch utf lin debug filename mybatis trigge version 可以參考如下配置 <?xml version="1.0" encoding="UTF-8"?> <

springboot添加log4j日誌配置log4j.xml生成日誌文件

ota urn version xmlns private 1.0 owa ram .json 第一步:添加pom文件依賴 <!-- log4j --> <dependency> <

log4j2.xml完美配置

ase 間隔 ner 1.0 日誌輸出 war oot web deb 配置文件 <?xml version="1.0" encoding="UTF-8"?> <!--日誌級別以及優先級排序: OFF > FATAL > ERROR >

IO流讀取資料檔案,將資料寫入資料庫,並記錄資料匯入日誌

流程分析: 資料型別: ROUTE_ID,LXBM,ROAD_NAME,SRC_LON,SRC_LAT,DEST_LON,DEST_LAT 10000,G50,滬渝高速,115.8605349,30.08934467,115.5437817,30.08898601 10001,G

聊一聊log4j2配置檔案log4j2.xml

 一、背景   最近由於專案的需要,我們把log4j 1.x的版本全部遷移成log4j 2.x 的版本,那隨之而來的slf4j整合log4j的配置(使用Slf4j整合Log4j2構建專案日誌系統的完美解決方案)以及log4j2配置檔案的詳解,就需要我們來好好聊一