精华内容
下载资源
问答
  • logrotate是 linux 系统用来分割日志的系统工具,可以方便将日志按周期(日,周,月)和大小进行分割。 当我们的服务器访问量比较大时,服务器的 access.log 可能会 G/天的级别增长,而我们希望日志可以按天周月或...

    logrotate 是 linux 系统用来分割日志的系统工具,可以方便将日志按周期(日,周,月)和大小进行分割。

    当我们的服务器访问量比较大时,服务器的 access.log 可能会 G/天的级别增长,而我们希望日志可以按天周月或当日志文件大小达到某个限额时进行分割。

    修改/etc/logrotate.d/nginx文件,如下:

    /var/log/nginx/*.log {
        daily    
        missingok 
        rotate 14 
        compress  
        delaycompress 
        dateext      
        notifempty   
        create 0640 www-data adm 
        sharedscripts
        prerotate
            if [ -d /etc/logrotate.d/httpd-prerotate ]; then
                run-parts /etc/logrotate.d/httpd-prerotate;
                 fi
        endscript
        postrotate
            if [ -f /run/nginx.pid ]; then
                            kill -USR1 `cat /run/nginx.pid`
                    fi
        endscript
    }

    配置说明

    daily:指定转储周期为每天,也可以是weekly:每周,monthly:每月
    
    rotate:转储次数,超过将会删除最老的那一个,上述代码中意味可以存30个
    
    missingok:忽略错误,如“日志文件无法找到”的错误提示
    
    dateext:切割后的日志文件会附加上一个短横线和YYYYMMDD格式的日期
    
    compress:通过gzip 压缩转储旧的日志
    
    delaycompress:当前转储的日志文件到下一次转储时才压缩
    
    notifempty:如果日志文件为空,不执行切割
    
    sharedscripts:只为整个日志组运行一次的脚本
    
    prerotate/endscript:在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
    
    如果不出意外的话,你可以到/home/wwwlogs下发现多了一个类似access.log-20180503这样的文件。

    //保存好配置文件后,可以执行以下命令测试:

    # logrotate -vf /etc/logrotate.d/nginx

    参考自 https://www.helloweba.net/server/550.html

    展开全文
  • logrotate分割日志

    千次阅读 2017-12-15 15:25:07
    所以此篇文章介绍如何使用logrotate工具来管理这个日志文件,如果文件大小达到一定大小就分割文件。 logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。...

    上一篇给出了一个简单的守护方式运行java程序的脚本,其中有一个问题,那就是把标准输出放到了一个文件中,这会导致这个文件越来越大。所以此篇文章介绍如何使用logrotate工具来管理这个日志文件,如果文件大小达到一定大小就分割文件。
    logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。

    安装

     yum install logrotate cron

    安装后系统会定时运行logrotate,一般是每天一次。系统是这么实现按天执行的。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate。在centos上脚本内容是这样的:

    /etc/cron.daily/logrotate:

    /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0

    此文件中只是执行了logrotate命令,然后传递一个配置参数。我们可以新建自己的脚本来执行logrotate命令,然后把脚本加入crontab中,就可以自定义文件分割了。

    logrotate参数

    参数 描述
    compress 通过gzip 压缩转储以后的日志
    nocompress 不需要压缩时,用这个参数
    copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
    nocopytruncate 备份日志文件但是不截断
    create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
    nocreate 不建立新的日志文件
    delaycompress 一起使用时,转储的日志文件到下一次转储时才压缩
    nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
    errors address 专储时的错误信息发送到指定的Email 地址
    ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
    notifempty 如果是空文件的话,不转储
    mail address 把转储的日志文件发送到指定的E-mail 地址
    nomail 转储时不发送日志文件
    olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
    noolddir 转储后的日志文件和当前日志文件放在同一个目录下
    prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
    postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
    daily 指定转储周期为每天
    weekly 指定转储周期为每周
    monthly 指定转储周期为每月
    rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
    tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
    size size 当日志文件到达指定的大小时才转储,后缀MB.

    实战

    新建配置文件:logrotate.conf,内容如下:

    /home/project/route/route.out{
            nocompress
            copytruncate
            create 0664 root root
            nomail
            rotate 10
            size 1M
    }
    

    新建脚本 logrotate.sh,内容如下:

    /usr/sbin/logrotate /home/project/route/logrotate.conf

    加入crontable:内容如下:

    [root@hadoop4 route]# crontab -e
    * * * * * /home/project/route/logrotate.sh >/home/project/route/aaa.log 2>&1
    

    程序运行一段时间后结果如下:

    -rw-r--r--. 1 root root  641345 12月 15 14:41 route.out
    -rw-r--r--. 1 root root 1093908 12月 15 14:41 route.out.1
    -rw-r--r--. 1 root root 1883706 12月 15 14:40 route.out.2
    

    文件已经被分割了转储了。

    展开全文
  • 按照内容分割日志 前言 前一段时间接到一个需求,在特定场景下进行告警。需要将告警内容写入到日志文件中,运维人员会收集这类日志进行告警。这就需要将告警信息写入到单独的日志文件中,即通过内容将日志分割。 ...

    按照内容分割日志

    前言

    前一段时间接到一个需求,在特定场景下进行告警。需要将告警内容写入到日志文件中,运维人员会收集这类日志进行告警。这就需要将告警信息写入到单独的日志文件中,即通过内容将日志分割。

    这里不介绍logback与log4j2的比较与选择,直奔主题——logback和log4j2是如何通过关键字将日志分割的。

    logback

    maven依赖

    <!-- logback依赖 -->
    ···
    <logback.version>1.2.3</logback.version>
    <janino.version>3.1.0</janino.version>
    ···
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <!--  janino 需要通过此包进行关键字匹配-->
    <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>commons-compiler</artifactId>
        <version>${janino.version}</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>janino</artifactId>
        <version>${janino.version}</version>
    </dependency>
    

    配置文件

    logback.xml
    如注释所示,配置一个告警日志alertAppender,包含指定关键字的日志内容会写入到所指定的日志文件中。

    1. alertAppender
      • RollingFileAppender
        • 按照日期分割日志
      • SizeAndTimeBasedRollingPolicy
        • 通过maxFileSize,maxHistory,totalSizeCap等参数制定分割规则
          +** EvaluatorFilter**
        • 通过配置expression进行包含关键字内容的过滤
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration debug="true">
    
    	<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{traceId} %-5level %logger{36} %L - %msg%n</pattern>
            </encoder>
        </appender>
    
    	<!-- 主要配置!!! -->
        <!-- 配置报警日志 -->
        <appender name="alertAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 接收WARN级别日志,不是WARN级别的会拒绝,WARN级别的进行下一个filter判断 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>NEUTRAL</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <!-- 通过EvaluatorFilter结合janino包下的JaninoEventEvaluator 实现指定关键词过滤 -->
            <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
                <!-- 日志中必须包含ALERT,包含的接受,不包含的拒绝 -->
                <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                    <expression>return message.contains("ALERT");</expression>
                </evaluator>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
    
    		<!-- 日志输出到指定日志中,500MB时分割日志,最多30个,最大50GB -->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- rollover daily -->
                <fileNamePattern>logs/logback/alert-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxFileSize>500MB</maxFileSize>    
                <maxHistory>30</maxHistory>
                <totalSizeCap>50GB</totalSizeCap>
            </rollingPolicy>
    
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}--%msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    	      <!-- rollover daily -->
    	      <fileNamePattern>logs/logback/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    	       
    	       <maxFileSize>500MB</maxFileSize>    
    	       <maxHistory>30</maxHistory>
    	       <totalSizeCap>50GB</totalSizeCap>
    	    </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %X{traceId} %X{invokeNo} %logger{40} %msg%n</pattern>
            </encoder>
        </appender>
        
        <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    	      <!-- rollover daily -->
    	      <fileNamePattern>logs/logback/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    	       <maxFileSize>500MB</maxFileSize>    
    	       <maxHistory>30</maxHistory>
    	       <totalSizeCap>50GB</totalSizeCap>
    	    </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %X{traceId} %X{invokeNo} %logger{40} %msg%n</pattern>
            </encoder>
        </appender>
        
        <logger name="alertAppender" level="WARN" addtivity="false">
            <appender-ref ref="alertAppender"/>
        </logger>
        <logger name="warnAppender" level="WARN" addtivity="false">
            <appender-ref ref="warnAppender"/>
        </logger>
        <logger name="infoAppender" level="INFO" addtivity="false">
            <appender-ref ref="infoAppender"/>
        </logger>
        
        <root level="info">
            <appender-ref ref="alertAppender"/>
            <appender-ref ref="warnAppender"/>
            <appender-ref ref="infoAppender"/>
            <appender-ref ref="consoleAppender"/>
        </root>
    </configuration>
    

    Demo

    demo与测试结果如下:

    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.RandomStringUtils;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @Slf4j
    @SpringBootTest(classes = LogExampleApplication.class)
    public class LogTest {
    
        @Test
        public void logTest() {
            System.out.println("=========================");
            log.info(RandomStringUtils.randomAlphabetic(6));
            log.info("alert info");
            log.warn("alert warn");
            log.warn("ALERT warn");
        }
    }
    

    日志文件内容
    控制台输出
    根据输出结果可以看到,只有包含关键字“ALERT”的内容输出到了alert.log中,其他内容被过滤了。

    log4j2

    maven依赖

    由于使用的是springboot,需要默认使用logback,需要将spring-boot-starter-logging依赖排除

    <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-log4j2</artifactId>
    </dependency>
    

    配置文件

    log4j2.xml
    告警日志配置

    1. 按照每日分割日志:
      • 配置RollingFile ,如果同时配置File和RollingFile ,二者的fileName不能相同,否则RollingFile 配置可能会失效。
      • 配置TimeBasedTriggeringPolicy ,每日触发分割
    2. 按照大小分割日志
      • 配置SizeBasedTriggeringPolicy ,当日志达到指定大小时,进行分割,分割出来的日志名参照filePattern配置
    3. 按照关键字过滤日志
      • 配置RegexFilter,通过正则匹配符合的内容。
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="debug" monitorInterval="60">
        <Properties>
            <Property name="default_log_pattern">
                [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] (%c{1}:%L) [TxId:%X{PtxId} SpanId:%X{PspanId}] %m%n
            </Property>
        </Properties>
    
        <Appenders>
            <Console name="STDOUT" target="SYSTEM_OUT">
                <PatternLayout pattern="${default_log_pattern}"/>
            </Console>
    
            <RollingFile name="alertRollingFile"
                         filePattern="logs/log4j/alert-%d{yyyy-MM-dd}.%i.log"
                         fileName="logs/log4j/alert.log">
                <!-- 正则匹配,符合条件的写入日志 -->
                <RegexFilter regex=".*ALERT.*" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout>
                    <Pattern>%d{yyyy-MM-dd HH:mm:ss}--%msg%n</Pattern>
                </PatternLayout>
                <Policies>
                    <!-- 每次启动执行 -->
    <!--                <OnStartupTriggeringPolicy />-->
                    <!-- 达到250MB进行分割 -->
                    <SizeBasedTriggeringPolicy size="250 MB"/>
                    <TimeBasedTriggeringPolicy />
                </Policies>
                <!-- 最多20个 -->
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
    
        </Appenders>
    
        <Loggers>
            <Root level="info">
                <AppenderRef ref="STDOUT" level="info"/>
                <AppenderRef ref="alertRollingFile" level="warn"/>
            </Root>
        </Loggers>
    </Configuration>
    
    

    Demo

    同上
    由于只有alertRollingFile配置了写入日志文件,且根据规则过滤,所以只有带关键字“ALERT”的日志内容写到日志文件中。
    在这里插入图片描述

    demo地址: git@github.com:github-lee-future/log-example.git

    展开全文
  • 在我们遇到的某些项目现场上,用户接入设备数过多,会导致日志消息频繁打印,日志过大,出现无法打开日志的问题。 日志文件夹logs,系统日志文件****-yyyymmdd.log **** -error.log、**** -sms-yyyymmdd.log,需要...

    在EasyGBS接入设备的限度上,理论上是没有最高限度的,但是根据服务器的运行能力,接入设备过多的话会出现的一些卡顿或者故障。在我们遇到的某些项目现场上,用户接入设备数过多,会导致日志消息频繁打印,日志过大,出现无法打开日志的问题。

    日志文件夹logs,系统日志文件****-yyyymmdd.log
    **** -error.log、**** -sms-yyyymmdd.log,需要将其按照大小和时间分割,达到****-yyyymmdd.log.1、****-yyyymmdd.log.2这样的效果。

    分割之前,打开缓慢,需要疯狂加载:

    51.png

    随后我们需要实行以上的分割方案,日志打印之前先从配置文件读取出日志文件的单个文件配置大小,在根据当前日志的大小进行判断,是否需要分割。参考代码如下:

    if rl != nil {
       return rl
    }
    alarm := Conf().Section("module")
    logSize := alarm.Key("log_size").MustInt(0)
    logDir := LogDir()
    logFile := filepath.Join(logDir, strings.ToLower(EXEName())+"-%Y%m%d.log")
    if logSize > 0 {
       _rl, err := rotatelogs.New(logFile, rotatelogs.WithMaxAge(time.Hour*24*3), rotatelogs.WithRotationSize(int64(logSize*1024*1024)))
       if err == nil {
          rl = _rl
          return rl
       }
    

    分割之后减轻了单个日志的压力,日志则能正常打开:

    52.png

    展开全文
  • 这里写目录标题一、Apache虚拟主机(一)构建虚拟web主机(二)http支持的虚拟主机类型(三)基于域名访问虚拟主机(四)基于IP地址访问虚拟...Web 虚拟目录与用户授权限制四、Apache 日志分割五、AWStats 分析系统...
  • 写在前面 Nginx是没有以日期格式作为文件名来存储的,也就是说,Nginx不像Tomcat,每天自动生成一个日志...首先,我们要创建一个脚本文件,用来分割Nginx日志,具体脚本如下: vim /usr/local/nginx-1.19.1/cutnginxl

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 311
精华内容 124
关键字:

如何分割日志