04.日志管理

日志管理

springboot默认日志框架是Logback,并用INFO级别输出到控制台
级别分别是TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF

如:
  • root日志配置
    logging.level.root=error
  • org.springframework.web日志配置
    logging.level.org.springframework.web=debug
  • hibernate日志配置
    logging.level.org.hibernate=debug
配置日志输出文件logging.file或logging.path属性
  • logging.file,设置文件,绝对路径或相对路径
    如logging.file=log/info.log 就是项目下的log/info.log文件
  • logging.path,设置目录,会在该目录下创建spring.log文件,并写入log
    不能同时使用,若都配置logging.file生效,默认情况下,日志文件的大小达到10MB会切分一次,产生新的日志文件
    ,默认级别为ERROR,WARN,INFO
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.file=log/info.log
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} %magenta([%thread]) %clr(%-5level) %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm:ss} %magenta([%thread]) %clr(%-5level) %logger- %msg%n
  • %d{yyyy/MM/dd-HH:mm:ss} %clr(%-5level) [%magenta(%-15thread)] %cyan(%logger{60}(%line)): %msg%n
  • %d:日期,大括号里面为日期的显示格式;
  • %clr(): 根据内容显示不同颜色的的方法,一般是给“日志级别”这个信息使用的;
  • %level:日志级别,百分号和关键字中间的短杠和数字(-5)表示显示这么多个字符的宽度,内容不足则补充空格占位;
  • %magenta():将内容显示为品红色字体
  • %-5level——日志级别,并且使用5个字符靠左对齐
  • %thread:线程名;
  • %cyan:将内容显示为青色字体;
  • %logger:事件发生的位置的所在类的全类名;
  • %line:事件发生的位置的行号;
  • %msg:事件信息;
  • %n:换行,输出跨操作系统的换行符号;

    自定义日志配置文件

    Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项
    创建logback-spring.xml并放置到resource目录下
    若起其它名字,如conf,可配置:

    logging.config=classpath:conf.xml

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

    <!--property用于配置变量,可通过${LOG_PATH} 取对应的值-->
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_PATH" value="log"/>
    <property name="PATTERN"
              value="%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss} | %highlight(%5p) | %green(%thread) | %boldMagenta(%logger) | %cyan(%msg%n)"/>

    <!--设置上下文名称-->
    <!-- 可以通过%contextName来打印日志上下文名称,随便起,一般来说我们不用这个属性,可有可无-->
    <contextName>logback</contextName>

    <!--输出到控制台,一个appender定义一种输出策略,可以定义多个-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--filter中定义要输出的日志级别,例如:输出info级别以上的日志,默认是info-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <!--日志输出编码格式化-->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- 输出到文件info,日期滚动记录 -->
    <appender name="logInfoFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--<Prudent>true</Prudent>-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--过滤 其他只留info-->
            <level>info</level>
            <!--匹配到就禁止-->
            <onMatch>ACCEPT</onMatch>
            <!--没有匹配到就允许-->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy 每天会生成一个日志文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式,以防止日志填满整个磁盘空间-->
            <fileNamePattern>
                ${LOG_PATH}/info/iot-info-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>

        <append>true</append>

        <!--日志输出编码格式化-->
        <encoder>
            <charset>GBK</charset>
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!--把上边的两种输出策略添加到跟节点,名称要保证和上边一致,否则报错 ,并指明输出级别为INFO-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="logInfoFile"/>
    </root>

    <!--可选节点,用来具体指明包的日志输出级别  如果不设置,则会交个root配置的appender处理-->
    <!--将该包下的日志交给console的appender处理,additivity设为false表示不再向上传递,如果置为true,则root接到后会再打印一次。 -->
     <logger name="com.fly" level="INFO" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</configuration>
logger的使用
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    logger.debug("=============debug日志=============");
    logger.info("=============info日志=============");
    logger.warn("=============warn日志=============");
    logger.error("=============error日志=============");
logback-spring.xml配置
<!--可选节点,用来具体指明包的日志输出级别  如果不设置,则会交个root配置的appender处理-->
<!--将该包下的日志交给console的appender处理,additivity设为false表示不再向上传递,如果置为true,则root接到后会再打印一次。 -->
<logger name="com.fly" level="INFO" additivity="false">
    <!--输出策略-->
    <appender-ref ref="console"/>
</logger>
多环境日志输出

在logback-spring.xml配置springProfile节点定义如prod生产环境,test测试环境,dev开发环境的日志输出

   <!--多个环境使用逗号隔开-->
    <springProfile name="test,dev">
        <logger name="com.fly" level="INFO"/>
    </springProfile>
    <springProfile name="prod">
        <logger name="com.fly" level="ERROR"/>
    </springProfile>

application.properties配置环境

spring.profiles.active=dev
使用log4j进行日志管理
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>

resources下建立log4j.properties

log4j.rootLogger=info,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] =%m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] =%m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold=info
log4j.appender.info.append=true
log4j.appender.info.File=/log/info/log4j.log
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] =%m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold=DEBUG
log4j.appender.DEBUG.append=true
log4j.appender.DEBUG.File=/log/debug/log4j.log
import org.apache.log4j.Logger;
private Logger logger = Logger.getLogger(this.getClass());
logger.debug("=============debug日志=============");
logger.info("=============info日志=============");
logger.warn("=============warn日志=============");
logger.error("=============error日志=============");

转载于:https://www.cnblogs.com/fly-book/p/11563032.html

要实现日志管理系统的**高级功能**,包括**日志分类、聚合、归档、分析**,我们需要结合 **InfluxDB 的数据模型设计** 和 **Flux 查询语言** 的能力,构建一个结构清晰、功能完备的日志处理系统。 --- ## ✅ 一、日志分类(使用 tag:level, source) ### 1. 数据模型设计 ```text measurement: log_data tags: level(info/warn/error/debug), source(app-server/db-server/web-server) fields: message(日志内容) timestamp: 时间戳 ``` ### 2. 示例写入数据(Line Protocol) ```text log_data level="error",source="db-server" message="Connection timeout" 1717020801000000000 log_data level="info",source="app-server" message="User login success" 1717020800000000000 ``` --- ## ✅ 二、日志聚合(Flux 的 aggregateWindow、count、filter) ### 1. 按照时间窗口聚合日志数量 ```flux from(bucket: "logs") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "log_data") |> filter(fn: (r) => r._field == "message") |> aggregateWindow(every: 1m, fn: count) |> limit(n: 10) ``` ### 2. 按日志级别分类统计数量 ```flux from(bucket: "logs") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "log_data" and r._field == "message") |> group(columns: ["level"]) |> count() ``` ### 3. 统计某个来源(source)的日志数量 ```flux from(bucket: "logs") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "log_data" and r._field == "message" and r.source == "app-server") |> count() ``` --- ## ✅ 三、日志归档(InfluxDB Retention Policy) ### 1. 创建保留策略(Retention Policy) 你可以通过 InfluxDB UI 或 API 创建保留策略,例如保留日志 30 天: ```bash influx bucket create \ --name logs_30d \ --org your-org \ --retention 720h # 30天 ``` ### 2. 写入数据到特定保留策略的 bucket ```bash curl -X POST "http://localhost:8086/api/v2/write?bucket=logs_30d&org=your-org" \ -H "Authorization: Token YOUR_TOKEN" \ -H "Content-Type: text/plain; charset=utf-8" \ --data-binary "log_data level=\"warn\",source=\"web-server\" message=\"Disk usage high\" 1717020802000000000" ``` --- ## ✅ 四、日志分析(Flux 查询) ### 1. 查询错误日志并按时间排序 ```flux from(bucket: "logs") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "log_data" and r._field == "message" and r.level == "error") |> sort(columns: ["_time"], desc: true) ``` ### 2. 查询某个时间段内的日志并展示原始内容 ```flux from(bucket: "logs") |> range(start: 2024-04-01T00:00:00Z, stop: 2024-04-02T00:00:00Z) |> filter(fn: (r) => r._measurement == "log_data" and r._field == "message") |> limit(n: 20) ``` ### 3. 聚合每小时错误日志数 ```flux from(bucket: "logs") |> range(start: -24h) |> filter(fn: (r) => r._measurement == "log_data" and r._field == "message" and r.level == "error") |> aggregateWindow(every: 1h, fn: count) ``` --- ## ✅ 五、日志系统功能汇总 | 功能 | 描述 | 实现方式 | |------|------|----------| | 日志分类 | 使用 tag(level, source)进行多维分类 | Line Protocol tag 支持 | | 日志聚合 | 统计日志数量、趋势 | Flux `aggregateWindow`, `count()` | | 日志归档 | 设置日志保留策略 | InfluxDB Retention Policy + bucket | | 日志分析 | 查询、过滤、排序 | Flux 查询语言 | --- ## ✅ 六、Grafana 可视化建议 - 添加 InfluxDB 数据源; - 创建 Dashboard; - 添加 Panel: - 显示日志数量趋势(使用 `aggregateWindow`); - 显示日志详情(使用 Flux 查询); - 显示按 level 分类的饼图; - 显示按 source 分类的柱状图; --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值