阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

httpd日志和日志轮替工具

94次阅读
没有评论

共计 6956 个字符,预计需要花费 18 分钟才能阅读完成。

本文目录:
1.1 错误日志 ErrorLog
1.2 访问日志 CustomLog
1.3 日志轮替:rotatelogs 工具
1.4 日志轮替:cronolog 工具
1.5 rotatelogs 和 cronolog 的比较

需要记录的日志类型有:错误日志 ErrorLog、访问日志 CustomLog。错误日志一般采用默认即可,最多改下错误日志的存放路径,而 CustomLog 因为量比较多,很可能需要定制。事实上,ErrorLog 由 httpd 的核心模块提供,而 CustomLog 却提供了专门的模块 mod_log_config 来处理,该模块还支持 TransferLog 指令,该指令和 CustomLog 作用和用法基本类似,如有需要可查官方手册,本文略过。

最后介绍两种日志轮替工具:apache httpd 自带的 rotatelogs 工具和 cronolog 工具。

 

1.1 错误日志 ErrorLog

错误日志的级别 LogLevel:debug, info, notice, warn(默认), error, crit, alert, emerg。

错误日志的定义语法:

ErrorLog file-path|syslog[:[facility][:tag]]

如果使用 syslog 替换 file-path,则表示采用系统自带的 syslog 日志工具,facility 是记录 syslog 日志的设施类型。一般来说,不会采用这种方法记录日志。

如果采用 file-path,则有两种方式:直接指定文件路径;前面使用管道,表示将输出的日志作为标准输入传递给管道后的日志处理程序,例如传递给 apache 自带的 rotatelogs 工具。例如:

ErrorLog "logs/error_log"
ErrorLog "|/usr/local/apache/bin/rotatelogs /var/log/error_log 86400" common

当然,对于 ErrorLog 来说,数据量并不会太多,一般直接使用文件记录即可。对于 CustomLog,则可以考虑使用日志切割工具进行分割、轮替等行为。

错误日志的记录格式由 ErrorLogFormat 指令控制,例如以下是 worker 和 event 模式下错误日志的默认记录格式,其中各参数代表的意义见官方手册ErrorLogFormat

ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"

 

1.2 访问日志 CustomLog

使用 CustomLog 指令指定访问日志记录的位置,可以在同一个 host 下多次使用该指令表示同一条日志记录到多个位置。语法格式为:

CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression]

使用 LogFormat 可以指定日志记录的事项,例如是否要记录客户端 IP 地址,是否要记录请求方法等。使用 LogFormat 还可以定义日志分类(在 httpd 术语中称为 nickname),例如 common 类、combined 类、combinedio 类。它支持非常弹性化的记录事项,具体的见官方手册LogFormat

LogFormat "%h %l %u %t \"%r\"%>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\"%>s %b" common

<IfModule logio_module>
  # You need to enable mod_logio.c to use %I and %O
  LogFormat "%h %l %u %t \"%r\"%>s %b \"%{Referer}i\"\"%{User-Agent}i\"%I %O" combinedio
</IfModule>

然后使用 CustomLog 指令就可以使用已经定义的日志类。例如:

CustomLog "logs/access_log" combined

当然,使用 LogFormat 定义分类只是为了方便,CustomLog 指令完全可以不使用 nickname 而是直接定义要记录的事项。例如:

CustomLog "logs/access_log" "%h %l %u %t \"%r\"%>s %b \"%{Referer}i\"\"%{User-Agent}i\""

如果提供 CustomLog 的第三个参数,即 env 或者 expr,则表示满足条件的请求才会记录日志。例如,当请求的是 gif 文件时将独立记录该日志,而其他请求则记录在另一个日志中。

SetEnvIf Request_URI \.gif$ gif-image
CustomLog "gif-requests.log" common env=gif-image
CustomLog "nongif-requests.log" common env=!gif-image

通常来说,除了特殊需求,一般都只需使用 LogFormat 提供的各个事项即可。否则日志订制就是一件非常恶心且复杂的事情。

 

1.3 日志轮替:rotatelogs 工具

首先说明 rotatelogs 工具,它是 apache httpd 提供的一个基于时间间隔、大小切分日志的简单工具。

默认,它在启动时不会立即创建日志文件,而是在有请求到达时才会创建。同理在轮替时也如此,如果到达了轮替的时间间隔,如果没有新请求到达,则暂时不会创建新的日志文件。如果使用 ”-f” 选项,则在启动时,不管是否有没有请求,都立即创建日志文件。如果使用 ”-c” 选项,则在每次轮替时无论是否有新请求到达,都创建新日志文件。

rotatelogs [-l ] [-f ] [-t] [-v] [-e ] [-c] [-n number-of-files] logfile rotationtime|filesize(B|K|M|G)

选项说明:

  • logfile:指定日志记录路径。可以加上一些修饰符,例如时间类的 a.log_%Y.%m.%d 将在 a.log 后追加年、月、日的后缀,如果没有给定任何后缀修饰,则自动加上 ”.nnnnnnnn”,表示创建时的时间点换算成距离 1970-01-01 00:00:00 的总秒数,也就是 ”date +%s”,每次轮替时也会加上该后缀。如果使用相对路径,则相对于 ServerRoot。
  • -n:使用数字作为后缀,且表示轮替的循环列表,例如 ”-n 3″ 表示一直在 log.1、log.2、log.3 这三个文件中记录,不会再创建任何新的日志文件。
  • rotationtime:指定轮替的时间间隔。将初始化为对应时间格式的起始值。例如,设置为 3600 时,将表示在每个小时的开头进行轮替,尽管当前时间点进入下一个小时可能只有 5 分钟,在 5 分钟之后也会进行一次轮替。
  • filesize:以大小方式轮替日志。
  • -l:使用本地时间计算时间间隔。默认使用的是 UTC 时间。
  • -f:强制立即打开日志文件。因为有些时候在启动 httpd 时,可能一小段时间内没有任何请求到达,因为没有日志需要记录,所以暂时不会创建日志文件。使用该选项可立即创建文件。
  • -t:截断日志而不再是轮替日志。这种情况下,不会再添加任何文件后缀。
  • -v:详细记录轮替或截断时的信息。
  • -e:将日志也输出到标准错误输出中。当日志还需要被其他工具处理时,该选项有用。
  • -c:每个时间间隔到了都创建新文件,尽管没有日志到达。而默认的情况下,在轮替时间间隔到达时,如果没有日志到达,将暂时不会创建日志,而是等待第一个请求到达后才创建。

关于更多的时间类修饰符,见下文。

注意,如果出现了轮替时文件名重复的情况,例如按照 5M 大小进行轮替,但文件名的格式为 ”a.log_%Y.%m.%d”,如果同一天内出现了多次轮替,由于文件名相同,则会覆盖旧文件进行记录。

另外,rotatelogs 只能对日志文件名本身使用时间类修饰符,无法将其设置在目录上,否则启动 httpd 时会因为无法打开日志而报错。

示例:以下使用了日志管道 ”|”,表示记录的日志传递给后面的程序 (此处为 rotatelogs) 进行处理。

每天轮替一次 $ServerRoot/logs/mylog.nnnnnnnn,其中 nnnnnnnn 是当前时间换算成秒的数值。且在启动时不立即创建日志文件,轮替时也不立即创建新日志文件。

CustomLog "|/usr/local/apache/bin/rotatelogs logs/mylog 86400" common

按照文件大小轮替。

CustomLog "|bin/rotatelogs /var/log/logfile 5M" common

轮替错误日志,达到 5M 时就轮替。

ErrorLog "|bin/rotatelogs /var/log/errorlog.%Y-%m-%d-%H_%M_%S 5M"

截断日志而非轮替日志。

CustomLog "|bin/rotatelogs -t /var/log/logfile 86400" common

以下是日期类的修饰符。下面的 cronolog 工具也采用这同一套修饰符。

%    % 字符
n    换行
t    水平制表符

时间类:  
H    小时(00..23)
I    小时(01..12)
p    该 locale 下的 AM 或 PM 标识
M    分钟(00..59)
S    秒 (00..61, which allows for leap seconds)
X    该 locale 下时间表示符(e.g.: "15:12:47")
Z    时区。若时区不能确定,则无意义

日期类:  
a    该 locale 下的工作日简名(e.g.: Sun..Sat)
A    该 locale 下的工作日全名(e.g.: Sunday ..  Satur-ay)
b    该 locale 下的月份简称(e.g.: Jan .. Dec)
B    该 locale 下的月份全称(e.g.:  January .. December)
c    该 locale 下的日期和时间(e.g.: "Sun Dec 15  14:12:47 GMT 1996")
d    当月中的天数 (01 .. 31)
j    当年中的天数 (001 .. 366)
m    月数 (01 .. 12)
U    当年中的星期数,以周日作为一周开始, 其中第一周为首个含星期天的星期(00..53)
W    当年中的星期数,以星期一作为一周的开始, 其中第一周为首个含星期天的星期(00..53)
w    工作日数 (0 .. 6, 0 表示星期天)
x    该 locale 下的日期表示(e.g. "13/04/97")
y    两位数的年份(00 .. 99)
Y    四位数的年份(1970 .. 2038)

 

1.4 日志轮替:cronolog 工具

可以在 epel 源中下载,或者从其 github 上安装:https://github.com/fordmason/cronolog

[root@xuexi ~]# cronolog -h
usage: cronolog [OPTIONS] logfile-spec

   -H NAME,   --hardlink=NAME maintain a hard link from NAME to current log
   -S NAME,   --symlink=NAME  maintain a symbolic link from NAME to current log
   -P NAME,   --prev-symlink=NAME  maintain a symbolic link from NAME to previous log
   -l NAME,   --link=NAME     same as -S/--symlink
   -h,        --help          print this help, then exit
   -p PERIOD, --period=PERIOD set the rotation period explicitly
   -d DELAY,  --delay=DELAY   set the rotation period delay
   -o,        --once-only     create single output log from template (not rotated)
   -x FILE,   --debug=FILE    write debug messages to FILE
                              (or to standard error if FILE is "-")
   -a,        --american         American date formats
   -e,        --european         European date formats (default)
   -s,    --start-time=TIME   starting time
   -z TZ, --time-zone=TZ      use TZ for timezone
   -V,      --version         print version number, then exit

这个工具的使用非常简单,但必须得搞懂它的轮替原理。以下面设置为例:

CustomLog "|/usr/local/sbin/cronolog logs/%Y/%m/%d/access.log" combined

由于使用的是相对路径,所以它相对于 ServerRoot。假设 ServerRoot 为 /usr/local/apache,则这里的日志将创建在 /usr/local/apache/logs/%Y/%m/%d/access.log,其中 %Y、%m、%d 分别表示的是年、月、日。这些修饰符组成的文件名或目录被称为模板。

cronolog 的轮替原理是:根据当前日志文件模板的时间点,和当前时间进行比较,如果模板中的某个部分和当前时间点的不同,则需要进行轮替,轮替时会自动创建缺失的目录,并且计算下一次进行轮替的时间点。在轮替时,先关闭当前日志文件,再根据当前时间点创建新日志文件,并打开新日志文件。但注意,cronolog 工具在创建或轮替时,如果没有请求到达,则不会立即创建日志文件,这和 rotatelogs 工具的默认情况是一样的。

看上去很简单,确实很简单,它只需要根据指定的时间修饰符和当前时间点进行比较就可以了。例如上面的配置,如果当前时间点为 2017-10-01,则按照以下顺序进行创建,注意,只有在请求到达时才会创建,没有请求时是不会创建的。

  • Period 1:在第一个请求到达时创建
    • logs/2017 目录是否存在,不存在则创建。
    • logs/2017/10 目录是否存在,不存在则创建。
    • logs/2017/10/01 目录是否存在,不存在则创建。
    • 创建 logs/2017/10/01/access.log 文件,并写日志。
  • Period 2:在 2017-10-02 凌晨第一个请求到达时创建
    • logs/2017 目录已存在,不创建。
    • logs/2017/10 目录已存在,不创建。
    • logs/2017/10/02 目录不存在,创建。
    • 创建 logs/2017/10/02/access.log 文件,并写日志。

之后将继续按照此规则不断进行下去。

也就是说,cronolog 默认将按照最小单位的时间修饰符为轮替时间间隔。例如,最小单位为 %d 时,将按照天轮替,最小单位为 %W 将按周轮替,最小单位为 %S,将按秒轮替。但仍然需要说明的是,只有请求到达时,才会按照当前时间点创建新的日志文件。例如,如果按秒轮替,第 10 秒时创建了一个文件 10.log,第 11 秒将关闭该日志文件,但是不会立即创建新日志文件,假设在第 15 秒时新的请求到达,则创建一个 15.log,而不是 11.log。

此外,cronolog 可使用 ”-p N UNITs” 选项显式指定轮替时间间隔,有效单位 UNITs 为:seconds,minutes,hours,days,weeks 和 months。例如 ”-p 5 minutes” 表示每 5 分钟轮替一次。但需要注意,N 的值必须为更高一级 UNITs 的公因数(不包括最大公因数),例如小时的长度为 60 分钟,在指定 minutes 单位时,可以指定 ”1,2,3,4,5,6,10,15,20,30 minutes”,但不能指定为 ”7,9,11,12,13,14″ 等 minutes。

如果不想轮替,有两种方法:不要使用时间类的修饰符;使用 ”-o” 选项。这时候会一直写同一个文件。

cronolog 还支持动态符号链接功能,例如下面的配置,这样就使得每次访问 /usr/local/apache/logs/access_log 都能访问到最新的日志文件。

CustomLog "|/path/to/cronolog --symlink=/usr/local/apache/logs/access_log /usr/local/apache/logs/%Y/%m/access_log" combined

最后,cronolog 不支持日志截断。

 

1.5 rotatelogs 和 cronolog 的比较

这两个工具各有优缺点。

  1. 在日志文件路径上:rotatelogs 无法将时间类修饰符作为目录,只能使用在日志文件名上。而 cronolog 可以。例如 logs/%Y%m/%d/access.log。
  2. 在日志控制力度上:rotatelogs 对日志的控制力更强,它可以控制启动时、轮替时是否立即创建日志文件。而 cronolog 仅只能在有新请求到达时才创建日志文件。
  3. 在特性上:rotatelogs 更丰富一些,它支持日志截断,支持在一定数量内循环轮替。而 cronolog 只能轮替,且只能按照时间不断向后轮替。
  4. 在日志访问方便性上:cronolog 通过它的动态符号链接功能使得这一点比 rotatelogs 方便的多。

其实这些都是小问题。

 

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计6956字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中