易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 575|回复: 7
收起左侧

测试 syslog本地和远程日志分离以及日志分割

[复制链接]
发表于 2023-3-21 13:06:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
第一步:配置syslog或者rsyslog服务& n0 B: j2 y+ o  b  h8 W6 D

& |( @) h; L! T( N) `8 t: F对于rsyslog
8 x4 R- K5 f+ |+ Z) R; f- T2 u7 L7 T+ z9 r1 l
#vim /etc/sysconfig/rsyslog9 C& d# F( T$ Y  `  A
) D7 g1 e# |8 E, c$ O* r! c
将SYSLOGD_OPTIONS修改为  L) L* J8 x* y5 o, H
SYSLOGD_OPTIONS="-c 2 -r -m 0 -x"  t% t# ?9 r) S6 B' n- l
& X+ b8 u7 {) U& o3 x
-c 2 的意思是:
4 ~1 e+ r9 o  f# syslogd options are deprecated since rsyslog v3
; p( l; ~1 z  y: X3 m# if you want to use them, switch to compatibility mode 2 by "-c 2"
7 D) v- A4 E( m$ l5 M$ u-r 意思是接收远程日志
: D) a  j/ \5 F: {-x 是关闭自动解析对方日志服务器的FQDN信息,这能避免DNS不完整所带来的麻烦,要和-r一起用。
& P) h( ?1 L+ r-m 0 # -m 0 disables 'MARK' messages.
6 D3 f$ g& T5 m! g
! ]! F/ o$ G$ }5 \  z- ^0 C: p9 o* ]: K$ B5 p
. n5 [# R; }$ U$ i3 a9 u8 y
对于syslog( O7 L. I$ K, ^

  R( o) P( V9 o& f: E# m; l9 U#vim /etc/sysconfig/syslog
0 \7 |/ f# D/ D( c! @6 A' ^0 v4 b, O
SYSLOGD_OPTIONS="-r -m 0 -x"
5 \6 X5 n9 J4 j5 O  o7 L3 a6 L$ ^8 e0 ]. E
4 n* J& p3 x9 m: D1 I! e' V" y
. W# O" K0 V+ v1 n1 I* O
重拉syslog 或者 rsyslog4 y6 t' w: a8 Q/ V. H  l. \

& R5 K; O' k2 `& Y- ]9 T. x. d$ @0 h; q" [% w! U1 Y2 M1 [

" n0 s1 v4 E. p4 Z第二步,修改syslog或者rsyslog服务的配置文件
; n$ g* s7 a' s# k) p/ U
6 s, a) \* X+ s5 _7 I对于rsyslog:
/ C; H) F! ^3 H7 u7 ?6 L) q! f9 Q+ T: B" P5 C% U) m/ c2 b
#vim /etc/rsyslog.conf
4 \% a# g7 s: E" N* X& x3 \$ A- H$ d' z" J; X+ Q8 G
开启UDP和TCP(配置默认是注释掉的,删掉#开启即可)
& B3 L* \" z! ^' G
8 f) l2 s$ s) j4 \$ Y# Provides UDP syslog reception   ###udp协议的syslog日志# S) Y4 l+ k$ A7 E0 L
$ModLoad imudp.so& l( }) p4 ~3 O
$UDPServerRun 514* `; L+ X: h; J2 K& c
  F& g* k8 l) p  b
# Provides TCP syslog reception   ##tcp协议的syslog日志) b$ x! I: w- r! k
$ModLoad imtcp.so
. I! _$ z4 g, A7 s' W$InputTCPServerRun 514+ W' T* |* L% R+ @7 d
6 |  |' }/ C/ k- S0 b
在 #### RULES #### 下添加自定义的类型和级别以及指定的输出文件路径,比如:
+ c" X3 o+ s3 r
: Y5 s; ~  v1 G$ M+ K3 s# B* _$template FILENAME,"/data/%fromhost-ip%/message.log": F6 u+ e" N/ Y2 t* h! C3 X2 d& x
$template FILENAME,"/data/%fromhost-ip%/mesage%fromhost-ip%.log"% E: F- B3 l5 f8 i

1 T& b) O1 Z( `$ G, v*.* ?FILENAME
2 Y% E; Z: t3 R: w
+ |/ T" g8 B  d9 F' K5 p! W2 D例子:# Provides UDP syslog reception: B& `) u1 Y9 k( S0 _: Q( R: C+ k
$ModLoad imudp
5 P: a) z+ D( i* H$UDPServerRun 514+ U) g9 o5 z+ y( j  J, P$ s
$template FILENAME,"/data/%fromhost-ip%/message%fromhost-ip%.log"
2 C" l% x2 c7 D; d4 f*.* ?FILENAME* h  u& c% A. G& C
  P- f# S! h$ V4 X+ s: U! ~9 x, H
% V$ o2 c1 \: B8 n
4 y/ F+ h3 }4 O9 y% Q: H
# Log all the web messages in one place.
" [2 H' Y  r8 A  E0 ~1 y$ n6 g' m+ F$ p) B5 ?, @
$ l+ z" a8 N: l( I8 \
local0.* -/var/log/web/web-access.log   #原文格式. j+ Q4 U# L" L

8 H" R+ Q$ x1 G4 k  o6 x
* N. m+ b% @0 J& D; e1 y7 }% F& \% `; N9 _
重拉后发现还是会记录动啊messages中去,因此修改messages行配置如下:
3 c: p$ x# Q. M" e3 ?
( [0 t( ?( u2 j& ?!local0.*;*.info;mail.none;authpriv.none;cron.none /var/log/messages   #原文格式0 U% y( |3 E" z. ?! n  M0 z

3 |2 R/ b$ \) `; e6 O* P5 L, i+ W例子测试格式:. E* |, m7 y$ q
!$template;*.info;mail.none;authpriv.none;cron.none                /data/message; ^0 A3 I4 Z& L3 J  V! O8 s5 u0 @
4 p- T/ p3 P& r1 p/ F/ i, z

! X' T2 o$ g6 M3 ^( i, a8 E- i即在行首添加一个“!local0.*;”配置,意思是说,local0下所有级别的日志不记录到messages中去。
3 S* r) X2 X( j2 j
8 _/ u, R3 {' i% u/ K. G2 u9 N9 rsystemctl restart rsyslog.service 7 g" h( j) c' M4 p( [
重拉后生效。; Y* m& j8 ~' c

; B; G- K, R: {$ h" i# s- d7 o2 x  D* T) F6 H
logrotate中其他可配置参数,具体如下:% g' X) h( a" b

' c$ N- g2 v: o/ }) {9 o3 o# U; @( Fcompress                                  # 通过gzip 压缩转储以后的日志! V$ t# u( s' r- b# U" ?
nocompress                                   # 不做gzip压缩处理
, Q& o9 X0 a  ?: x; \* l6 L0 J' ycopytruncate                           # 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
- ]" @# e  n# T2 F3 W& L: @nocopytruncate                           # 备份日志文件不过不截断, P- V7 x/ @0 t- w3 y0 ]6 t
create mode owner group   # 轮转时指定创建新文件的属性,如create 0777 nobody nobody
# y* |1 m$ F2 n; {+ |nocreate                                   # 不建立新的日志文件
7 l  [2 V$ f2 _' g1 c$ Wdelaycompress                           # 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
  ~' B+ I4 d/ Z! r5 `! Tnodelaycompress           # 覆盖delaycompress 选项,转储同时压缩。) |, q5 u; y. g+ z+ g
missingok                                   # 如果日志丢失,不报错继续滚动下一个日志- U: D2 u! N, b0 s
errors address            # 专储时的错误信息发送到指定的Email 地址" A- p1 j: k- F* M" d" `
ifempty                                   # 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
# ^# T8 A( r  }1 E2 h! Unotifempty                                   # 当日志文件为空时,不进行轮转
$ T4 I' Z3 S7 }5 Hmail address                           # 把转储的日志文件发送到指定的E-mail 地址
1 f# ]4 i2 `% g# C8 f* j4 N0 c$ P# jnomail                                           # 转储时不发送日志文件
6 X8 F6 C- G3 _! g, T# `# Holddir directory                   # 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
, S& R) d% s  |+ bnoolddir                  # 转储后的日志文件和当前日志文件放在同一个目录下
- W9 g4 `1 y; }, S$ F, ^4 b, Bsharedscripts                           # 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本" j: ?! s$ }& R$ l
prerotate                                   # 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
# b/ M! i0 `% y* d0 p% O4 W$ wpostrotate                                   # 在logrotate转储之后需要执行的指令,例如重新启动(kill -HUP) 某个服务!必须独立成行
1 f: w$ p& \9 Ydaily                     # 指定转储周期为每天/ r" F6 Z/ ~& q7 q
weekly                                           # 指定转储周期为每周/ X) P" a* p$ @8 q4 m7 n# J: E; P
monthly                                   # 指定转储周期为每月  y, ]3 i9 e8 }$ U3 T/ F2 I
rotate count                           # 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份0 O- k6 u/ y( a; u2 N4 P
dateext                                   # 使用当期日期作为命名格式. D( a3 S* d5 n" I+ e
dateformat .%s                           # 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持%Y %m %d %s 这四个参数, E+ A: V( t, K% F5 y$ R1 j0 Y9 A
size(或minsize) log-size   # 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).' E. j. E1 F! }8 t# L: Y' w) ?2 A  M5 r
# 当日志文件>= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
+ V3 t: l4 W- D- L. ?: }# size = 5 或size 5 (>= 5 个字节就转储)  f  O9 O7 M1 p; y+ L% K$ @- x/ w
# size = 100k 或size 100k) |6 F! H1 N# I7 m# G
# size = 100M 或size 100M
4 k0 w2 C4 K9 O. k+ h, Q9 V: N1 ?
& z+ h+ h+ q* e  O, @" D2 w1 a! I
: w- s) d$ v9 A2 I/ Z
" I: e: F2 j. m5 {) P( d" w7 _
/ T( F- I3 q- P4 W7 ]- {, B/ e! w5 f9 C
 楼主| 发表于 2023-3-21 13:36:02 | 显示全部楼层
日志分割:# g1 M8 E  f: c
vim /etc/logrotate.conf
5 E7 n# t+ e4 t! ~/data/*/*.log{5 h  P. S. E3 H
    rotate 10
7 A/ i9 P. m0 }% Q    #weekly
. r- B0 L: Z2 G/ z+ m8 Z3 e- j    hours
/ l3 Q8 V* e1 M% t3 P! [    postrotate
% f" |3 Q0 k) W, K0 D" A. k    minsize 500M
$ h; ^7 @( v! O& j! B    create 0664 root b
$ J( q# ?: K$ g3 M2 h! X9 Y}( i* R% N) R+ ^

4 R# N; A* W3 I$ b* z  p8 Rlogrotate -vf /etc/logrotate.conf
 楼主| 发表于 2023-3-21 13:39:45 | 显示全部楼层
/data/*/*.log{
+ r! T2 f: S0 }    rotate 10
6 V: L0 w. [5 ~1 U( B8 I    #weekly; w9 o- l, u. a6 [. f# I! B1 ]/ e
    hours* T, w( l2 N8 e! X  N) v2 X6 a
    postrotate, v. C$ N' z) \5 _
    #minsize 500M* P* e  G+ L. Z. y+ `
    create 0664 root *.log1 q( k2 P0 e& J
}, h6 B3 @' m; x% R, Y( v0 V
" v2 D' s. o- c  q2 R& W& ^4 y
logrotate -vf /etc/logrotate.conf
 楼主| 发表于 2023-3-21 13:58:47 | 显示全部楼层
[root@server ~]# rpm -ql rsyslog7 O1 @4 `) U7 V% n8 ^
/etc/logrotate.d/syslog( ^" Y5 J* V  b# \- I2 ~% Z
/etc/pki/rsyslog       
5 N% M# `+ ^+ q8 P1 e: B( H/etc/rc.d/init.d/rsyslog                //启动脚本
( j1 J3 V- B! y) ]2 y. S/etc/rsyslog.conf                //主配置文件& k. x9 Q8 @( p" ^9 }$ ?
/etc/rsyslog.d                        //子配置文件
% ~) p0 {* w) d. u( v* X/etc/sysconfig/rsyslog5 K" E/ c3 U+ H1 z" G2 @
/sbin/rsyslogd
1 m9 I1 ]' j: B, _/usr/share/man/man5/rsyslog.conf.5.gz
: M1 E2 ~" l& ~2 o/usr/share/man/man8/rsyslogd.8.gz8 J/ q7 ?; q4 j& Z7 i  U

! i; i6 p$ D; }, o8 G" }[root@server ~]# grep -v ^# /etc/rsyslog.conf
+ S- {$ I' I9 B$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
2 V  h, Y% ^5 F+ [. r+ F& L( R' v9 c$ModLoad imklog   # provides kernel logging support (previously done by rklogd)& E5 Y0 N3 i/ @+ `$ h. v# h
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
/ ^4 i1 y- |: ~$IncludeConfig /etc/rsyslog.d/*.conf
  Y" _/ J% w# Q
- m$ O1 ?' g! l6 y. R! N) H*.info;mail.none;authpriv.none;cron.none                /var/log/messages( j% r2 U! `' o% |. ~

; F3 U2 F& f# P3 i& cauthpriv.*                                              /var/log/secure6 F6 G% ?4 S& ?( u5 X; k
5 r" N. ^/ W( S$ N
mail.*                                                  -/var/log/maillog
5 `; i& U: |" e+ I- I: Q7 M7 Y! ^# N
8 J0 T- A$ e" L
9 }" @) W5 `0 p8 y+ ?. Ncron.*                                                  /var/log/cron, v2 h- U: Z5 ]+ w
3 O+ J, J' L, t6 b& k# x4 v
*.emerg                                                 *: u/ a$ [" [9 ?9 X
$ v: {! n, P- D3 O% ~0 p: m3 T
uucp,news.crit                                          /var/log/spooler% N6 ?5 q$ ~& p0 f3 i

# N0 s4 F- \8 n" mlocal7.*                                                /var/log/boot.log
; T, C, k0 d7 h1 Q) C* J5 @3 i
% \+ H2 ^* T% u7 G9 _8 h$ O; P$template SpiceTmpl,"%TIMESTAMP%.%TIMESTAMP:::date-subseconds% %syslogtag% %syslogseverity-text%:%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"3 p! ]) s, s3 W

- ^+ W$ _: y" L+ U6 W0 {& n:programname, startswith, "spice-vdagent"        /var/log/spice-vdagent.log;SpiceTmpl
 楼主| 发表于 2023-3-21 13:59:46 | 显示全部楼层
更改ssh服务的默认日志记录载体# ?* @8 |& V) _# Q
通过rsyslog程序去管理来自指定设备载体的日志记录到指定的文件(修改/etc/rsyslog.conf)
. D- x! n( |; |" e; Z, [2 v$ I6 q8 k测试验证
- I& M/ y7 T& G# w1.修改ssh服务配置文件
) \: {, q5 O5 S  J* S[root@server ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
7 ^) {$ V7 Q  u5 Q: T' L9 Q[root@server ~]# vim /etc/ssh/sshd_config
- ?; r0 [1 f+ m# y% YSyslogFacility LOCAL6. \( |5 t, d( w4 M, X
2.重启服务( z* `1 Q1 S* I9 e6 p' t
[root@server ~]# service sshd restart( F  X" _5 @4 z/ E
Stopping sshd:                                             [  OK  ]) M+ y; B# Q; G' D
Starting sshd:                                             [  OK  ]
( s0 R" f/ Q' M& k3.将来自LOCAL6设备载体日志记录指定位置(rsyslog)3 W& b9 w- {9 R" u$ d; {1 R
[root@server ~]# vim /etc/rsyslog.conf
0 p; C; ]0 f' s, B' U; B: g: ]local6.*                                                /var/log/ssh5 M" E7 O6 E* q: n- I- z% v
4.重启rsyslog服务
* F7 M1 k. X3 o( V+ e) {[root@server ~]# service rsyslog restart
7 w& D1 W* [, a( _Shutting down system logger:                               [  OK  ]! T9 y* B' d5 g- R2 _5 A0 g- ~
Starting system logger:                                    [  OK  ]
: G- R! ~/ r4 F  [% ~5.客户端测试
% K) U$ S  `1 Q7 `4 o. b[root@client ~]# ssh 10.1.1.2: k1 s1 c) u) `$ y
Last login: Fri Apr 26 12:27:33 2019 from 10.1.1.1
. ]5 Z$ w3 I- [[root@server log]# ll ssh6 p; I0 d6 A( _- N0 B
-rw------- 1 root root 0 Apr 26 13:40 ssh
# O6 }( z" ^( [4 p- O! U[root@server log]# tail -f ssh
! U; D  B- N& {Apr 26 13:42:09 server sshd[2447]: Accepted publickey for root from 10.1.1.3 port 35951 ssh2( R7 Y1 c0 ?3 ]  ?/ ~4 p' ?
Apr 26 13:44:10 server sshd[2447]: Received disconnect from 10.1.1.3: 11: disconnected by user6 C0 e; }0 r1 U; T& i
此时进行ssh访问,日志会在local6和/var/log/messages里都出现; m; a5 L' l2 a. H5 s/ a9 D
" |1 L/ ^- P7 |5 |
如果不想记录到/messages,可修改/etc/rsyslog.conf,添加local6.none,则不再显示ssh的日志
: @8 v( g- T' h, m5 f0 h) o/ t*.info;mail.none;authpriv.none;cron.none;local6.none              /var/log/messages/ a; n4 E& i% y& K" F
 楼主| 发表于 2023-3-21 14:00:54 | 显示全部楼层
六、日志轮转. `/ u1 ]) ]; {$ |3 L
日志轮循(轮转):日志轮转,切割,备份,归档6 C* G& p/ U4 A5 O  L% q3 ^4 H
; d; c8 @" ^, c
为什么要日志轮转?/ p" F5 f3 O, w, n7 R9 c
避免日志过大占满/var/log的文件系统" m" z4 U  [/ a( ?
方便日志查看, }- O6 P/ W6 X2 R! M& `( r
将丢弃系统中最旧的日志文件,以节省空间
. u2 b8 R; D( i2 m6 X# O5 E+ D4 P日志轮转的程序是logrotate# m  T( q! i4 X
logrotate本身不是系统守护进程,它是通过计划crond每天执行
! z& F% D* C- s如何进行日志轮转?
+ R5 h2 J/ |( N/ L0 p: {! }了解相关配置文件" i+ {0 q9 S) N- C/ I
[root@log-server ~]# rpm -ql logrotate
5 `0 f7 u! T( T0 S4 W0 S) H/etc/cron.daily/logrotate                周期性计划任务
4 u. z$ g$ [4 }7 w( l+ R8 Z( l) u/etc/logrotate.conf                                配置文件
, b1 W$ ?( `! w+ d/etc/logrotate.d                                子配置文件存放路径; v( u  Z% @6 a& V. t) x" v
/usr/sbin/logrotate
* _) ^* |( Q" j+ N: y* p4 ~/usr/share/doc/logrotate-3.7.8
  t# i% _" X! u/usr/share/doc/logrotate-3.7.8/CHANGES# g, n, a% ^# N
/usr/share/doc/logrotate-3.7.8/COPYING
$ D! g+ }3 S0 b  K% o' w/usr/share/man/man5/logrotate.conf.5.gz
# \* g, x; M. Q, {2 M/usr/share/man/man8/logrotate.8.gz
# L* s' F% T6 \/var/lib/logrotate.status
2 L+ `! g, N3 b( l
: Y9 q" m3 Z+ S! s[root@log-server ~]# cat /etc/logrotate.conf
0 Y: N* T/ S4 B" M- _/ v" L) K# see "man logrotate" for details
4 ^1 O  \5 n5 _# g/ N# rotate log files weekly
+ M! s  E! A) ^$ K. Y9 C+ vweekly
& ^0 V& l! k! m) Z
3 ]# t+ q  ?& y# keep 4 weeks worth of backlogs        保留4周备份日志
6 o+ @9 j4 P( Y- u. V) @" `+ g6 B5 B7 Grotate 4
2 [6 ?6 _. @6 a7 M/ K" h/ _. v
+ d0 n, `( W, v; M' H" w; _# create new (empty) log files after rotating old ones4 o* ^9 C2 H. g# y, X
create
5 ?7 R% I6 A- s# Y4 \( S+ E& H8 J: ~9 I+ r# D6 D6 u
# use date as a suffix of the rotated file                日期作为后缀给旧文件重命名
- W- |5 L( q4 E* B* u; Rdateext! Y7 G3 k8 o+ q! J

/ ]7 Z* ~+ k4 U6 ]; R# uncomment this if you want your log files compressed
, ^7 ?. q: d& C$ s3 R/ r#compress
& W; X6 _# G% W" B+ V6 A6 `: C/ Y% q5 r! e: p
# RPM packages drop log rotation information into this directory( j7 s# @/ Y8 ?& |' }0 O' l6 t$ i
include /etc/logrotate.d        加载外部目录
6 n0 c" p$ |$ t  o0 ~7 ~' y! y. o
. I5 C, {+ T. _7 x7 i# no packages own wtmp and btmp -- we'll rotate them here. Q* d- }& h+ H) }$ N
/var/log/wtmp {* _) E/ ]  w7 l' _! b
    monthly8 ?" U  w' \0 |" z; k2 {0 J. k
    create 0664 root utmp               
2 z- |: H4 Q, }4 P        minsize 1M
  c9 A+ |% T; a% Q3 ~7 t    rotate 1        保留1份日志文件,每一个月备份一次日志文件( x3 F, o& ]2 i& U9 ^$ p9 A! x
}" h8 _1 l. P1 S. i3 K

/ w9 p  ]3 {. V4 V* f/var/log/btmp {
- J' q4 W6 ^: p$ b( B    missingok( Q" t( X5 D4 P! x) h% o0 \
    monthly2 n1 S/ S) ~9 R- M
    create 0600 root utmp
3 F  I, C4 ?. _( B- n+ B2 }9 d    rotate 1( F- W, t, O" \0 |! @+ d: G& R
}
7 u* a$ b: i. f+ ?! s! c
- }1 ^7 a* y7 N/ k/ W* j+ h7 E# system-specific logs may be also be configured here." R1 b  N4 m: G% A

6 M, g" o8 [. B$ u! G  V' [$ n常见的一些参数:6 T. ^& f! j) w8 F' @& @* z
daily                指定转储周期为每天
  S% d5 @3 N6 f$ q9 S. b- v. dmonthly                指定转储周期为每月
1 L9 F4 M1 x1 tweekly                每周轮转一次
+ f) o! x1 g1 G: irotate 4        同一个文件最多轮转4次,4次之后就删除该文件
( \( U0 ]; S2 Y5 N1 u, xcreate 0664 root uttmp        轮转之后创建新文件,权限是0664,属于root用户和utmp组
$ e% q9 E6 t( V; f2 g0 H! kdateext                用日期来做轮转之后的文件的后缀名( v! @) M6 h! J* C* |& ?! ?. G
compress        用gzip对轮转后的日志进行压缩  Q  n6 J3 Y! Q+ `  e4 H* w
minsize        30K        文件必须大于30k,且周期到了,才会轮转. r0 P! \0 o/ P! r8 _
size 30K        文件大于30k才会轮转,不论周期是否已到: l8 Q5 j* P4 Y- t: [
missingok        如果日志文件不存在,不报错  K- ~" N. u) H, @+ F
notifempty        如果日志文件是空的,不轮转
( F, }+ |: |6 L/ b7 T  |( vdelaycompress        下一次轮转的时候才压缩2 R9 o, ^& ]# ?: Q, s
sharedscripts        不管有多少个文件待轮转,prerotate和postrotate代码只执行一次3 y# i8 p$ \! u. I5 M% }
prerotate                如果符合轮转的条件,则在轮转之前执行prerotate和endscript之间的shell代码
" p  j( t! U. n- cpostrotate                轮转完成后执行postrotate和endscript之间的shell代码
0 ^8 D/ [# ^2 V8 G/ P7 j' B6 R' L* i3 C5 {9 ?
[root@server~]# cat /etc/logrotate.d/syslog * G9 D4 `) m9 E. _* h) @
这个子配置文件,没有指定的参数都会以默认方式轮转
9 v* r& }+ l9 C, f: |/var/log/cron
, U: q# ]: S- p7 c6 V# ^/var/log/maillog8 y1 c8 J* ^2 n
/var/log/messages
2 {1 H: v5 ~, Y8 c. D* W4 @4 B/var/log/secure
6 W/ X' }  {, j7 v6 p) ~# M/var/log/spooler
7 u6 @' z1 H" a4 v. |{2 W) |  [7 k  y4 c. v. l
    sharedscripts        不管有多少个文件待轮转,prerotate和postrotate代码只执行一次6 `% }7 ]8 q; t4 _0 N
    postrotate                转换完后执行postrotate和endscirpt之间的shell代码
) x) Y' B& g. o" a; s" \        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
3 T9 S' \  b& j  N& s! Y        轮转后对rsyslog的pid进行刷新(但pid其实不变)
% c9 I( L. T1 X& R# o; Y    endscript8 ?2 @) e& ?# h1 ^3 ]
}
* x. d. k8 \4 R7 s; [; R思考:为什么轮转后需要对rsyslog的pid进行刷新?- ^3 {& y( e3 y& }: d1 K, [# c
ll -i 查看文件的inode        * f$ m* z9 d2 B  ^: i4 h
-HUP 平滑重启
" k2 ]3 }2 ]5 X+ B2 w2 {( {  M7 ~# o6 J% _3 F0 H8 O

; N- h2 h) `1 M7 P5 o3 ]8 w( L0 r. a3 H
: C" W% q: f* U. _3 ~- n5 I& ?

# e6 v# p% v0 S$ c* y$ v5 I不以时间为后缀进行轮转,在/etc/logrotate.conf/ nodateext
$ V( t, e% F5 I" @1 a% J- ?2 n- q$ u4 e8 O$ H. ]
清空环境- N# b- ~; J, v% g, T2 z

, ^9 E; T: M% Y/ @. W* I* F2 L  g重启服务
  J, @6 P; ^3 V. z
5 N# E" L4 `  a2 _4 e& u  _8 ^6 V3 q1 i' x: w4 M- f9 Z: b$ ^

7 b4 _: R) S" J$ e0 F
! d- S* u& f" h* ]' M5 q" P7 x. S; O7 b; l
结论 ! N4 I$ `- \# |
+ ?$ d8 r3 f$ o" b; G6 p1 C
后刷新pid的话,logger -t "呵呵" "再见!"会写入旧文件(messages.1)里面
& _3 |  W3 M) `, B$ M5 K/ n5 @
将这句话放在/bin/kill这条命令后面,会写入新文件里
7 v  ~! o- Q/ o, L; c" T1 V2 \" z2 L* V
最新的文件是messages,第一次强制轮转后的旧文件是messages.1,cat messages.1会看到logger -t "呵呵" "再见!",到第二次就成messages.2。而第二次轮转后的messages.1成了第一次轮转后的messages的老文件。(看时间区别)# A& }* Y8 H1 @7 |
# r: T5 v7 V( b+ F
 楼主| 发表于 2023-3-21 15:21:32 | 显示全部楼层
手工配置2 p" f% ^+ J) L( z7 n
如果您无法通过脚本生成配置文件,这份指导将帮助您通过简单的复制、粘贴手动完成配置。$ J' v3 u: y) c/ o6 g) n

7 {: {4 j! ?& W假定您已拥有root或sudo权限,是在通用的Linux平台使用5.8.0或更高版本的rsyslog,rsyslog能接收本地系统日志,并通过5140端口与外界连接。
& {* u$ I) w, C& @2 F
' @8 `8 [1 z) Y7 K, ?0 M! F1 配置系统环境
- Z7 c+ ]3 G: q7 _: G% Z& Q粘贴以下脚本并运行,并且保证 /var/spool/rsyslog 目录已存在,如果是Ubuntu系统,还需要对目录进行权限设置。
. X* ?7 h4 w: c! I: C4 D% t1 F# b: r, a" f4 Q4 Z
sudo mkdir -v /var/spool/rsyslog
$ B: b/ H7 y% O! i9 L. tif [ "$(grep Ubuntu /etc/issue)" != "" ]; then
1 j( [% y" Q5 U& Psudo chown -R syslog:adm /var/spool/rsyslog " |3 N! u2 O" ]9 B( s4 O
fi
& p9 ]* H& ~0 y- h) |7 p2 更新rsyslog配置文件。
4 P4 v. P: e. S# m打开rsyslog配置文件,它通常在 /etc/ 目录下
4 \: {$ j' ?0 I4 {5 P7 W' {* M; R8 R/ f1 x* \+ z9 g( B
sudo vim /etc/rsyslog.d/rizhiyi.conf+ n9 |1 w3 |2 ~6 x- H/ I) |- R. \& ?
将下列内容粘贴在这个配置文件中
* ^  ?6 J# H1 W! N# s; p# Y8 ?" N* m8 d, D
复制代码
1 ^2 W1 M! ^# `! E. d0 X#real tran log  y% C% \6 i% ?) Z, x
$ModLoad imfile               #装载imfile模块. m. X8 C! T9 [4 q7 N
$InputFilePollInterval 3          #检查日志文件间隔(秒)
: j3 b! i1 `3 U* j7 ]7 \5 E. S$WorkDirectory /var/spool/rsyslog       #定义工作目录。例如队列文件存储存储文件夹。
. Y; T, W* ^. ~( N$ d
; Q7 _* h$ X( P# M8 z$InputFileName FILEPATH           #读取日志文件7 p6 Z0 ?2 l5 O
$InputFileTag APPNAME            #日志写入日志附加标签字符串 不要添加特殊符号
" w' Y' w+ ^8 V, q8 {+ Z9 T$InputFileStateFile stat_APPNAME     #定义记录偏移量数据文件名 不要添加特殊符号/ S! k" S( s( }
$InputFileSeverity info          #日志等级7 m( t# R! ^$ B6 {& t; r9 q' p, t. e
$InputFilePersistStateInterval 20000    #回写偏移量数据到文件间隔时间(秒)
+ Q9 n! Y3 _; p$RepeatedMsgReduction off         #关闭重复消息控制
) o5 j0 z$ N! P+ c* r$InputRunFileMonitor            #This activates the current monitor. It has no parameters. If you forget this directive, no file monitoring will take place.4 [; R) j8 B. u) L8 X9 u* ]
#https://www.rizhiyi.com/docs/fastuse/tag/  设置标签(rsyslog)
" L$ y9 y, s; n( v4 O3 ^0 U) u$template RizhiyiFormat_APPNAME,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [06f69fae723038bbc5d75d29564051ea@32473     tag=\"TAG\"] %msg%\n" ( h$ M) p5 t2 S' i# z; F
                                  #<85>          0    2014-09-14T16:52:59.814155+08:00   macbook    my_app       -      -   [91595477-c8e4-42b8-b1f9-696465b422ff@32473 tag="file_upload" tag="my_tag"]
* s. T% G/ c) ?; P; e4 G; ~6 \  L& e复制代码
; L/ g2 ]8 b" ^# lif $programname == 'APPNAME' then @@log.rizhiyi.com:5140;RizhiyiFormat_APPNAME 5 _$ n& @! R7 n/ x  u; K4 Z
if $programname == 'APPNAME' then ~
" N' ]: N3 J* o$ _! ]7 a9 u0 k+ v: z2 }; Y2 y$ L9 w) I
---------------------------------------------------------------对应的单台测试机的配置如下---------------------------------------------------------------------------------------
- @( r! |: Z" X5 q& R" z1 b$ K. g

' N+ W- x% Q( D( [1 ^) m. S5 o并替换
1 o7 S  b; _+ u/ n3 m6 I2 Y0 B- t# K5 N6 ^
FILEPATH: 需要上传的日志文件的绝对路径,必须包含日志文件名。
; }. j" E9 X3 L# J5 g# V示例:/var/log/nginx/access.log6 T9 D! ~" d" B
APPNAME: 用于标识上传的唯一应用来源,可用来定义日志分组,这将帮助您有效划分日志,缩小搜索范围。APPNAME设置正确与否直接影响到后台对日志字段的提取。如果您是VIP用户,日志易为您定制了日志解析规则,请填写日志易提供的针对该日志的APPNAME,以使定制的日志解析规则生效。 " x; P; r: y4 X6 K
示例: nginx_access/ m/ y4 ~, Q( n7 ]( W& a. j* j" b
TAG: 标签,标识日志的扩展信息,可定义多个标识,这里替换为您自行定义的标签,可用来定义日志分组,这将帮助您有效划分日志,缩小搜索范围。 + `- Y  X- ?- B% C# A) H& |! I# ^
示例: rizhiyi_search7 m2 t+ m, L2 v+ V
注意:" s. N( a: V- c3 j6 N3 Q; o' a
' y% u9 u/ o' }1 x2 d5 X
在 /etc/rsyslog.d/ 下的rsyslog配置文件中:
6 A( l# p; Z/ w. V$InputFileTag定义的APPNAME必须唯一,同一台主机上不同的应用应当使用不同的APPNAME,否则会导致新定义的TOKEN和TAG不生效;
" R) V" ~4 E$ ]- p/ p$template定义的模板名必须唯一,否则会导致新定义的TOKEN和TAG不生效;9 ~* s$ N' o$ }0 j4 z
$InputFileStateFile定义的StateFile必须唯一,它被rsyslog用于记录文件上传进度,否则会导致混乱;" l# S2 B7 t; O( g, {( i0 H
注意:@@log.rizhiyi.com:5140 该值为接收日志的服务器域名或者主机名。默认是log.rizhiyi.com:5140
9 [8 u0 G' f! s$ i0 h3 重启rsyslog
7 W1 P  B* X! a3 I/ I$ sudo service rsyslog restart( l3 z1 L+ b( W6 w' v! I6 q* s6 j+ M
4 验证  I$ i. O  I  O2 H1 a( w/ V% O  h
例如,配置文件中的tag字段已修改为"rizhiyi_search",可使用"tag:rizhiyi_search"搜索过去一小时的事件,检查日志易是否成功接收并正确识别日志,建立索引可能需要几十秒钟时间,需要等待几十秒钟。
  @( t0 E' a5 k5 f1 {  K! M' x3 X. e$ u: V1 i. |
#参考:7 C" u% x$ F( l7 P* e

/ t1 P! n4 I% s: Vhttp://www.voidcn.com/blog/anghlq/article/p-4958086.html+ w9 a$ u4 Z8 t6 [6 X9 G

. I1 Q# L; q5 c- a( }http://www.wnqzw.com/article/10798.html) n" J8 u& M- W: |% Y( A4 l
, {* j+ |0 R5 h# }
附:
# U3 O* E7 G& `& P3 L7 ]. K. m; o6 `# a0 @) T+ ]( E2 S
日志輸出模板
; u: R' P! A! @! P& O, r2 H通過模板可以更具需要來控制日志輸出的樣式。格式如下:
6 k/ a9 T% p/ o9 l; |$ R  h) v1 }: o$template <TEMPLATE_NAME>,"text %<PROPERTY>% more text", [<options>]" U6 g9 _: ?; j; W
$template 爲模板指令。<TEMPLATE_NAME> 爲模板名。"" 之間的文本爲模板格式。 被 % 包含的文本對應相關的屬性。<options> 指定修改 模板功能的一些選項,例如 sql 或者 stdsql 會格式化文本爲 SQL 查詢。
* l5 H9 ^% ^% E8 R動態文件輸出% @- D5 E! Z( f
通過日志和/或系統屬性決定輸出文件名。7 q4 Z9 i) K" a+ s5 A
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"
( u( L3 }" x0 ~& }4 P/ @*.* ?DynamicFile: D! I9 o4 N, [$ t6 B
使用 timegenerated 生成文件名,使用該模板則在前面加上 ?。4 }8 U& Y; g1 V9 K
其他例子如下:7 X8 X; G, }9 \$ k$ u
$template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log"9 G  R% r, M) {7 t( p7 X9 V
根據屬性控制日志輸出格式7 x! [4 n/ T! _+ u2 w
使用下面的格式可以對模板之中的屬性做各種修改操作從而定制日志的格式:
& A: \  `8 @- {2 k( v  P1 u%<propname>[:<fromChar>:<toChar>:<options>]%
0 i9 r( D8 R% D<propname> 屬性名,可用的屬性名參考上文。
% T3 V# ?$ x) y; k9 _. l<fromChar> 和 <toChar> 表示對屬性值字符串的操作範圍。 設置 <fromChar> 爲 R,<toChar> 爲正則表達式即可以通過正則 表達式定義範圍。
# m; C& a# h/ D1 Q& h7 o  l3 A<options> 則表示屬性選項。完整的列表可以參考 這裏的 Property Options 節。
( w# t! T- Y9 ]9 T/ }+ N一些示例如下:) S/ D5 X9 n4 e8 n5 l0 u
%msg% # 日志的完整消息文本4 N  ~2 \+ ?2 g
%msg:1:2% # 日志消息文本的最開始兩個字符
2 g/ i; {( E  [, |7 W2 Z%msg:::drop-last-lf% # 日志的完整消息文本,移出最後的換行符7 g: j/ t/ ~. u" G1 {9 Y6 z( g& W* J$ A
%timegenerated:1:10:date-rfc3339% # 時間戳的頭10個字符並按 RFC3999 標准格式化( m; F9 D+ }9 J4 X
下面是一些模板例子。
) ^4 I+ c# U* S! R6 M, r  Z輸出日志的級別,類別,收到日志時的時間錯,主機名,消息標簽,消息正文, 加上換行符:
. e4 g5 {8 @! F& |4 I7 @$template verbose,"%syslogseverity%,%syslogfacility%,%timegenerated%,%HOSTNAME%,%syslogtag%,%msg%\n"
: W5 X( v! x1 j2 `輸出日志來源,時間以及日志標簽,正文,同時還有蜂鳴聲(\7):- a* D1 a$ [" |1 r7 w3 N
$template wallmsg,"\r\n\7Message from syslogd@%HOSTNAME% at %timegenerated% ...\r\n %syslogtag% %msg%\n\r"
! z, M! w' W/ L. H# A+ u. v0 B; C9 }格式化日志以便于直接進行 SQL 操作:
" O: t" S& O: b' F+ {$template dbFormat,"insert into SystemEvents (Message, Facility,FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%',%syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')",sql  z0 d/ _' F# v: j% s* D
以 json 格式輸出,方便程序解析:/ z/ ^+ @, A' `0 W  S# n5 }1 B' U; s9 V9 n
$template jsonFormat,"{\"message\":\"%msg:::json%\",\"fromhost\":\"%HOSTNAME:::json%\",\"facility\":\"%syslogfacility-text%\",\"priority\":\"%syslogpriority-text%\",\"timereported\":\"%timereported:::date-rfc3339%\",\"timegenerated\":\"%timegenerated:::date-rfc3339%\"}\n"
- W' J) h4 g8 i# R9 V9 c% a$ s. B注意,message 的內容會在最前面多一個空格,其解釋請參考這裏。
6 e3 R6 n% L+ G3 @5 o; s3 H" Drsyslog 也提供了一些預定義的模板(以 RSYSLOG_ 爲前綴),參考 這裏 的 Reserved Template Names 節,其定義如下:
; O5 z6 g4 u* GRSYSLOG_FileFormat
. H0 O, I6 C2 [( p! h"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"
, w7 n- }  r8 f1 ~5 BRSYSLOG_TraditionalFileFormat
6 e5 S! M$ E$ X( Z4 J"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"
- U' x; d+ D2 _3 fRSYSLOG_ForwardFormat: U$ [2 F! Z% W2 i+ p
"<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"
" W1 U" i1 U/ e$ C9 `9 c; A: tRSYSLOG_TraditionalForwardFormat& A% D7 P! _+ Z9 w- p" l
"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"4 F0 L2 b  i! {2 m
使用這些模板,則在動作後附加 “;template_name” 即可,例如:
' `3 ^$ r( K: q% Q$ e:programname,startswith,"cron" -/var/log/cron;RSYSLOG_TraditionalFileFormat
 楼主| 发表于 2023-3-23 15:30:26 | 显示全部楼层
Rsyslog系统日志管理5 `0 P) b% f( a0 o# P9 i
课程目标
) h0 A# p- Y& Q# ?# Y( s3 d, B# u- q, f7 A" o4 d, \* g
了解日志的级别与作用$ m3 A7 l3 J1 h' }+ U' e" ], s
掌握 rsyslog 服务的本地日志和远程日志的管理
8 D& v" C1 Q8 ]3 ^- _能够使用 logrotate 程序根据需求对日志进行轮转
3 U, ]: |7 p( @一、常见的系统日志
! z- [# e6 g6 m, j日志格式:文本日志/二进制日志/数据库日志- |: R8 F1 L0 ]( t
默认的相关日志文件:( I  S0 F" v1 y" K: s: }
/var/log/boot.log        系统引导日志,记录开机启动信息
2 P5 w. i$ F" T8 d3 R8 M4 O/var/log/dmesg                核心的启动日志; d9 E! O7 p- x2 ]
/var/log/message        系统的日志文件* A) a6 _/ {% w# \) `) P6 R
/var/log/maillog        邮件服务的日志& q( |: g& J5 W
/var/log/xferlog        ftp服务的日志* m% n" F8 B  U& M0 o+ \8 ~
/var/log/secure                网络连接及系统登录的安全信息
( @8 T0 U) ?5 k$ n7 f1 B/var/log/cron                定时任务的日志
, g# K# X2 v9 C8 V$ q/var/log/wtmp                记录所有的登入和登出        last -f 查看/ A/ t: ?3 ]( ^1 z
/var/log/btmp                记录失败的登入尝试
) ^8 c9 p' h5 [- D二、日志管理程序
% R0 R( s6 T1 ~8 v' e, O: V7 f在RHEL6中,syslogd已经被rsyslog取代,它可以将日志写入数据库,并可以利用模板和插件控制输入输出。
) M8 ]$ T3 _. F: s( o* K* ursyslog程序管理本地和远程日志8 @5 Y: z8 {! C7 t) G! t) K
安装软件2 R0 F2 g$ q. o" ^* ^  A
根据需求修改配置文件' S5 Y6 Y/ k; t! }
启动服务
' v# l% N/ B9 X+ `% H$ \1 ?4 C测试验证
, V9 a; E: `  E4 n$ B三、日志级别
5 z2 E4 V5 Y2 p# ^. v# k# man syslog$ z3 i; J- L0 }( ^/ f2 O/ r
日志信息分为以下级别,从上到下级别一次降低( x8 L; A4 R8 l8 O7 R- A9 m
        none        none不是一个等级,它表示不记录服务的所有信息
  R3 ^0 A5 }6 Z* O8 C0         emerg        系统不可用
/ s- V' ^3 l# M6 v. J1        alert        特别留意的报警信息* [. V4 ?* P3 i
2        crit        非常严重的状况
& R5 d. W* H& m, y0 D3        err                错误信息       
$ s! J1 b% {7 s- x6 y4 I4        warning        警告信息' d9 ?9 j) \* R
5        notice        稍微需要注意的信息; `% L. d+ U4 ~
6        info        正常信息
1 `6 T, [+ ?7 U. W& X7        debug        调试信息,开发人员使用& [! n; p; E/ @. \% V! z3 p
* o: b+ {- M4 q3 {2 M3 a
四、日志配置# W" q3 z( j: U* v
[root@server ~]# rpm -q rsyslog
! T# Q2 o: d+ H) Krsyslog-5.8.10-8.el6.x86_64
1 m! U6 t; ^8 N8 I. n[root@server ~]# rpm -ql rsyslog
" C* l& b0 w' f  o# J3 Z8 L7 A/etc/logrotate.d/syslog
6 I7 o+ ^  }2 [; M6 c5 X. v/etc/pki/rsyslog       
1 C3 |, d+ X. ^7 t- C/etc/rc.d/init.d/rsyslog                //启动脚本
5 ]. N; W2 U/ U. y2 V( \$ \5 C/etc/rsyslog.conf                //主配置文件, q6 o( u# D% C5 @/ [) C; X9 ?" Z9 h
/etc/rsyslog.d                        //子配置文件) w7 _( a* L) r; |5 S; y
/etc/sysconfig/rsyslog5 B4 |8 G; u1 d( W3 n
/sbin/rsyslogd9 M; s' s$ ]/ A; e; T6 s
/usr/share/man/man5/rsyslog.conf.5.gz
; E2 F" F' Z- G% U! q7 r& q  E/usr/share/man/man8/rsyslogd.8.gz
. S- R8 A4 ]0 d- u) Z* ^  I: X8 ]
: }. D. C) Y- t" M# k% v[root@server ~]# grep -v ^# /etc/rsyslog.conf
7 F# u, q4 m0 H6 Z* K6 P- K. s1 Z$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)) ^" O. ^% Q' t+ `, x1 A
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)+ i$ P9 s, {% D' x0 w* ^
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat+ \7 @$ C1 a/ k% E( k4 g8 r
$IncludeConfig /etc/rsyslog.d/*.conf' o( e; Z5 k2 ]8 w# @

( I. i8 I  U/ n: q+ F# D*.info;mail.none;authpriv.none;cron.none                /var/log/messages0 a( }% H$ z( Z( \( ^2 O8 x) Q( v3 H
1 V  ?/ S* n! Q% J
authpriv.*                                              /var/log/secure
  h- ^9 H: t4 \$ P' A9 Q
- p; B9 A% x) p7 wmail.*                                                  -/var/log/maillog- b$ t8 Z4 N8 e
' _/ O& d# q& m7 R
/ v- G# f# L: p. G  s8 j4 H1 H' R
cron.*                                                  /var/log/cron" r' h6 C6 l1 M8 O) P( ^5 m

2 j! e" ~+ ^1 b6 J*.emerg                                                 *- j2 h/ ~0 \7 l( F! h- P0 q

* k+ \6 r7 m! k2 z* I: |# R9 R: fuucp,news.crit                                          /var/log/spooler$ H- u5 D: u5 U5 L" e5 B
( O( u) [& E) H+ Q4 s
local7.*                                                /var/log/boot.log
8 ~% F: c! S1 L& R$ }
7 a: Z) T3 ~  W" c$template SpiceTmpl,"%TIMESTAMP%.%TIMESTAMP:::date-subseconds% %syslogtag% %syslogseverity-text%:%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
4 M  l8 P8 s1 Y7 v8 X" V* e" N7 R: W: T
:programname, startswith, "spice-vdagent"        /var/log/spice-vdagent.log;SpiceTmpl  E# g, u. I1 E
! `+ t/ u' A9 k
1.日志定义相关符号
; u( k- A# L# u. t# @配置文件中常见的表示符合& e; a1 N" y! v6 H8 D( A
.        用来分隔服务和级别
- P0 G8 l8 E! c, ~. B3 n*        任何服务,或者任何级别
+ i2 B2 e8 g7 N0 c" U=         有等号表示等于某一级别,没有等号表示大于或者等于某一级别
) A% d  K9 @" f/ f% o!        排除操作,前面有相同服务的表达式,这个操作才有意义  ^' V. N0 N6 J, Q9 K
                代表从前面表达式所包含的内容中排除某些内容
# [  `; r3 W! f+ Y( h;        用于分隔不同的        服务,级别,组合
5 p1 ^) l1 M% L9 ~% Z' ]$ P,        用于分隔不同服务
# o* X( k( o+ b' K% R1 s-   用于指定目标文件时,代表异步写入7 R. ^5 M: ]+ }

" o, u0 _5 }) i* E+ f. V- B- I举例说明
  Y. v7 ?$ y8 N; g7 J4 }mail.=info
& U9 A9 w6 c; G) n: email.info                mail服务大于等于info级别的日志
/ {3 J; R# B2 j% {, M+ ~' y) y, wmail.info;cron.=info        /var/log/test.log2 w! l( V4 E( ~( \6 m. K7 s9 I
mail,cron.err" Q- x: o& Q7 X1 [0 E/ V; O
cron.=warning. A$ }( c7 Y" n% d
mail,cron.info
( ]- e# K$ _# K6 S0 ^% z" J# O
2 n3 N, q* u' g$ j$ v; a' ~) ycron.info;cron.!=err        012456
& Y7 a3 x( A9 c! n) q$ r0123456                01245674 m6 G+ l; p. v+ \
cron.info;cron.!err                456
/ R( h2 {# a7 D0123456                4567
$ X# D; a3 Y" Y" Z& y5 P1 C( d1 s( M
特别说明:0 i* y4 L$ C3 C2 V$ G4 A. g/ E2 F
The facility is one of the following keywords: auth,5 k5 C' W' ]) j) N; q
       authpriv, cron, daemon, kern, lpr, mail, mark, news,
6 N( U& b: m* G1 Y0 \. s       security  (same  as  auth),  syslog,  user, uucp and6 |$ O! o. T% W6 V: D7 h/ E$ O, j
       local0 through local7.(设备载体)7 T7 g7 B( B4 M0 A
log facility 设备        设施:用来记录一种类型日志的日志设备
0 K! G6 _* @; U6 W* P* [4 M: a7 R  i
daemon' W7 m4 c2 ~3 u% x- w4 K
auth9 T9 E/ k/ s9 e: C& c. M3 U
authpriv. }& E+ t% C( I. J1 s, U
user
& ?$ ?4 w. h' W- S& P: F9 _' D$ amail: O8 U7 H3 E+ N/ g3 k! c$ c! L
lpr! ~) e0 u3 d# F; M6 e
news
0 _* H, j% w4 s: D. ]uucp* P, @0 H; m0 W: X4 ?" b/ `
ftp- b4 O6 S  s; M6 i$ S" d
local7+ R( j& S, i, Y: a
       . X0 b0 O7 z* O8 ~

' Z- w: y% p8 L/ A- Y: n! G本地日志管理ssh
+ v( F; I- T/ D) D! ]; R8 F8 m* g; }+ t% v, P2 @# @
[root@server ~]# man sshd_config
- q/ e9 W5 e, Y5 @' W/ o/ G! b SyslogFacility
* b7 M# i( M) e- E         Gives the facility code that is used when logging
7 }1 o) {9 G3 k. a4 `$ V; b% Q. m4 m: V         messages from sshd(8).  The possible values are: DAE-
$ Y" V3 I5 d- a1 |5 f8 \         MON, USER, AUTH, AUTHPRIV, LOCAL0, LOCAL1, LOCAL2,
# f. e2 m- x1 n6 r         LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.  The default
+ x, c& \; V4 K1 G         is AUTH.7 z, B( u' ^% o6 x# Z3 x9 f8 o# w
更改ssh服务的默认日志记录载体
: e' \# s! F, B/ A% ^通过rsyslog程序去管理来自指定设备载体的日志记录到指定的文件(修改/etc/rsyslog.conf)
3 B7 U1 ^' G. q0 R- _: e3 U% u) e  r测试验证( }* J4 R2 N2 S5 V3 Y. h6 B3 T: |
1.修改ssh服务配置文件
' W3 b5 c0 p) E+ X# N' s[root@server ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
6 w! R5 h0 R0 j[root@server ~]# vim /etc/ssh/sshd_config
3 Q- P- B2 O! Y, BSyslogFacility LOCAL6/ h* w. G# z( Q7 ^/ L3 d
2.重启服务; W# g! |9 D7 h# G1 S
[root@server ~]# service sshd restart6 e; m: \6 O7 q1 ]! z  @( ~
Stopping sshd:                                             [  OK  ]
6 m/ B' ^) u# l! K4 {7 s1 EStarting sshd:                                             [  OK  ]
; I* ]# _; e  w+ J+ J, P# ]& X3.将来自LOCAL6设备载体日志记录指定位置(rsyslog)
) Z* r- V6 O2 }; t0 t4 R; p[root@server ~]# vim /etc/rsyslog.conf
6 O9 Q. A1 ^% q% Xlocal6.*                                                /var/log/ssh
8 i) o- b& o$ m' \# p  Y4.重启rsyslog服务- e3 R/ Y0 L& E2 B( q" _4 F/ ?" {
[root@server ~]# service rsyslog restart
3 Z6 g' I  o+ L& S  lShutting down system logger:                               [  OK  ]
8 x4 I1 s9 L4 o' mStarting system logger:                                    [  OK  ]2 G" L9 e2 r4 A6 }+ N2 {& f+ n4 W; Y
5.客户端测试: o9 p% W$ i; j% ~
[root@client ~]# ssh 10.1.1.2
2 B. }5 M: N$ W1 a& m# I5 ?: l4 YLast login: Fri Apr 26 12:27:33 2019 from 10.1.1.1
0 g- a9 h. t# M9 @[root@server log]# ll ssh
) {; O; }: A7 w" w1 N; n" c. l) B-rw------- 1 root root 0 Apr 26 13:40 ssh) U6 p+ n: ?" s
[root@server log]# tail -f ssh$ ^" }, a; u) q* p' h% ~) Z
Apr 26 13:42:09 server sshd[2447]: Accepted publickey for root from 10.1.1.3 port 35951 ssh2
+ N. ^- x3 d& T" z% FApr 26 13:44:10 server sshd[2447]: Received disconnect from 10.1.1.3: 11: disconnected by user+ Q4 g; Z: Y; M; _' W: L* [
此时进行ssh访问,日志会在local6和/var/log/messages里都出现
; W/ Q. B' t( R
) v& m! c9 y' h( c" X. D如果不想记录到/messages,可修改/etc/rsyslog.conf,添加local6.none,则不再显示ssh的日志% S4 y2 s. s9 N$ p! u( s6 B
*.info;mail.none;authpriv.none;cron.none;local6.none              /var/log/messages5 D- z4 }* S3 G% t$ H: a+ ]1 w

" v  Q$ Z2 W6 i, W6 j" j( V五、远程日志管理
$ ~3 w9 O5 _$ U, z) W; J# }8 k; N目前:把多台服务器的日志远程记录到其中一台日志服务器集中化管理,方便对其统一分析和管理
. ^1 f6 Z, J# T. A% q0 a1 h* r+ _2 x6 M4 O# ?
环境:
( d; r7 A  O& `6 }9 P. X7 o' b
5 T' v5 c( J3 t7 O8 }log-server:10.1.1.2
7 v$ v# J) Z: J# x0 Y' \7 {$ g. a  e+ |/ K
应用服务器:10.1.1.3: O0 g+ O- W  H$ K' J9 w
. }3 ]- A* z/ K0 X
ssh服务服务——>其他人远程访问该应用服务器产生ssh服务日志——>远程记录到log-server上
! g# f3 R9 {# o
- J" \. t+ Q4 X6 Z' Eclient:10.1.1.4
5 U; V9 t# l' ~! D3 B8 x$ g6 b; p4 z# v0 s$ ?& q. e! g8 S& k" `
ssh:10.1.1.3——>日志记录10.1.1.2
2 H: f$ I$ l& ^! B+ M+ u# O
+ i1 \# `4 R/ {( t0 m) l. }需求:把web服务器上的ssh服务日志,远程记录到log-server上
! S6 w1 V. r( Y  M5 q4 `( s# |( u& q
思路:
2 ?; _2 Q4 {4 m, s, N
1 t5 E" j- L1 `web应用服务器上操作$ J4 _& _8 X: _$ `: t
1 y% O, B& B( r9 n& Y
将web服务器上的ssh服务的日志单独记录2 w9 _* ]5 ^( O
指定ssh服务的设备载体" f1 d- D' x9 e8 F5 |
重启服务
6 i' M, S7 |% q, j( N" i; {将来自于ssh服务的日志设备载体上的日志远程发送到log-server上
) O' S* Z6 `9 J/ M" k3 n2 @以下操作在log-server上操作
2 {2 `1 n) O8 @* ~
) S' ]2 t/ K2 A通过修改配置文件,打开日志传输端口
3 E% D; f# p4 I( y1 o0 t加载相应模块 tcp | udp
! C# f3 u. R7 @. ~打开接收端口 默认514端口" h1 A: E" c6 y* u# H! q  T
启动服务后日志默认会保存到/var/log/messages
6 m: d) s; D$ D步骤:3 r; H$ v8 w' S, Q7 n0 i' N
. ]; s, C8 `+ X7 H; U
以下操作在log-service(10.1.1.2)服务上完成
% M# a+ O0 c# {0 o3 X1.加载相应模块打开接收端口(可以选择udp、tcp都打开)5 Z& M+ I' O) U6 ]6 d
[root@log-server ~]# vim /etc/rsyslog.conf
* l: z" e0 |/ w# Provides UDP syslog reception
. Z7 l6 B% M8 e% i, Y2 n- x$ModLoad imudp
# j/ [/ M3 {3 |8 q1 u' P$UDPServerRun 514
) b- T# M6 G( [$ z
* D6 o0 V9 J* f* [( o# Provides TCP syslog reception
2 j* i9 |5 n9 @7 M# h* l2 i' o: j$ModLoad imtcp
* |9 B! L3 E% F0 C; O$InputTCPServerRun 514
+ k0 r7 |4 z1 G4 H, o: E$ ]2.重启服务
% X! y3 S; W& m4 pservice rsyslog restart. @3 J* H3 [2 b6 o2 W6 u( _* D9 G) z
[root@log-server ~]# netstat -nltup |grep 514                //验证端口是否打开
/ F. P3 |6 _0 |$ l% mtcp        0      0 0.0.0.0:514                 0.0.0.0:*                   LISTEN      2822/rsyslogd      
+ i2 Y0 }" C8 |1 \7 J" j  Dtcp        0      0 :::514                      :::*                        LISTEN      2822/rsyslogd      
7 d4 E. M+ W$ H6 P) v* U& c: @8 Yudp        0      0 0.0.0.0:514                 0.0.0.0:*                               2822/rsyslogd       $ D: d4 \" s( H4 q: A- ~8 q
udp        0      0 :::514                      :::*                                    2822/rsyslogd
+ t: B! C- h! `1 O. V6 |! |3 B. F( S6 ^; `& V6 N( q9 A
以下操作在应用服务器完成(10.1.1.3):  x- k% I7 [* Y+ M. k' ]; B
1.指定ssh服务的日志文件的设备载体
: [+ J  g4 e# ?[root@ssh-server ~]# vim /etc/ssh/sshd_config
; A. o  s: j9 o& vSyslogFacility LOCAL0
0 c' D8 b4 y9 ?8 o7 w/ Z9 s2.重启ssh服务) v  K3 R4 N6 V4 e/ E
[root@ssh-server ~]# service sshd restart+ H; ^7 N% X8 ~. R
3.修改/etc/rsyslog.conf来指定ssh服务的日志发送到远端去
. B* n* _" m( w2 j[root@ssh-server ~]# vim /etc/rsyslog.conf ; I4 [$ A4 J. q  C) s# l$ P$ }0 T
$ L3 `& ?& v8 c$ e+ h$ \6 z8 N
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional0 }) m( w6 v. A, o1 p# f7 p7 R, T
#*.* @@remote-host:514
+ |* H4 Y' D& J" n% R2 M& X; |7 p$ z3 |$ ?
local0.*        @10.1.1.2:514        //一个@表示udp,两个@表示tcp  
0 t: x7 ^$ f) c4 B最关键的一步,将日志远程发送给10.1.1.2
) J6 f' M. O6 j* r5 e1 s$ u9 j. e; M# Y  @- Z! n
+ D& k9 Z7 q- _  v" X: N
4.重启rsyslog服务7 |6 b0 V9 J. |6 G/ m
[root@ssh-server ~]# service rsyslog restart" v  `, T0 |) G$ _% N7 j/ }
Shutting down system logger:                               [  OK  ]; j& D* A! N9 `; J+ X5 \% L
Starting system logger:                                    [  OK  ]; Q- a  C/ \  ?
! p& E& U5 Q7 S8 m* q8 B: _
测试验证(client:10.1.1.4), l8 o- c* k$ j! Z! u/ R
[root@client ~]# ssh 10.1.1.3
! r) h3 B4 W6 t! T2 m: i4 a2 a) gThe authenticity of host '10.1.1.3 (10.1.1.3)' can't be established.
/ E# q+ X  U3 |/ D1 O* }3 KRSA key fingerprint is a5:98:06:58:84:35:d3:f4:4c:f8:43:a1:a5:12:f5:8e.
5 J/ j* _; w, ~$ J, aAre you sure you want to continue connecting (yes/no)? yes
8 A* L; ~( U2 `- |& u& NWarning: Permanently added '10.1.1.3' (RSA) to the list of known hosts.
1 K7 D4 X  @8 i( e2 croot@10.1.1.3's password:
! q! I3 J# z" A4 y# NLast login: Fri Apr 26 14:46:31 2019 from 10.1.1.1
: z* E( D1 `. N' C$ ?4 C( Y' z" j5 r2 l# R" x, T' t
[root@log-server ~]# tail -f /var/log/messages: `9 K( v6 Z) E' @; i+ i
Apr 26 15:12:30 ssh-server sshd[2858]: Accepted password for root from 10.1.1.4 port 58561 ssh2+ T5 a! ~  e- @' [" t. i
[root@ssh-server ~]# tail -f /var/log/messages
' o4 w  i4 Z8 KApr 26 15:12:30 ssh-server sshd[2858]: Accepted password for root from 10.1.1.4 port 58561 ssh2& w: g; ?$ \6 U+ Z# j
(不想记录就修改/etc/rsyslog.conf,将local0.none加在/var/log/messages那行里)
' c4 g+ S/ `. E, a. ?  ~( r# r5 O9 G
注意:selinux和防火墙,还有udp和tcp 端口514是否打开1 x+ P$ B) @) @* C% I9 O: m
+ i8 j8 c6 p3 S( n7 }' g6 s
六、日志轮转0 \' _/ T/ M% C+ |
日志轮循(轮转):日志轮转,切割,备份,归档. Y- ]8 e! p, m9 b/ B2 ~6 m

( ^2 x) Y2 f. p- {) _( w为什么要日志轮转?$ A; }2 H$ {+ ^9 H3 [; Q
避免日志过大占满/var/log的文件系统& C' R! u4 N. j. K& b  _
方便日志查看
0 Y* ]$ w; ?, U- F  G5 D7 q将丢弃系统中最旧的日志文件,以节省空间& A! `5 z9 I* U- D, H
日志轮转的程序是logrotate
7 g' Y! A2 r3 L6 m& [' klogrotate本身不是系统守护进程,它是通过计划crond每天执行
  ^: c7 Z8 [! m) F如何进行日志轮转?$ F  u5 A: E/ y$ U
了解相关配置文件
) a$ }$ Z3 u/ i. k/ b  T7 e[root@log-server ~]# rpm -ql logrotate% W; J7 c9 b- n6 Y
/etc/cron.daily/logrotate                周期性计划任务
# q% o" D- t/ b& Y" [) o8 N/etc/logrotate.conf                                配置文件8 `( p7 ^  B9 N0 I; G' X
/etc/logrotate.d                                子配置文件存放路径. o5 g8 D( g7 H5 D
/usr/sbin/logrotate
. i/ N8 E( k6 P" X* z/ _/usr/share/doc/logrotate-3.7.8
( j, _) a( ^) H$ J* e/usr/share/doc/logrotate-3.7.8/CHANGES
$ M/ J/ b0 f0 N& g$ l5 r! A/usr/share/doc/logrotate-3.7.8/COPYING
5 |7 T' N* p! `- a/usr/share/man/man5/logrotate.conf.5.gz3 q" V; I$ N* L$ C8 _$ x& C6 W. z/ d3 }
/usr/share/man/man8/logrotate.8.gz
0 b3 n6 b; B) d& q% L/var/lib/logrotate.status8 _! G8 e$ B: q. i8 {1 R) o
3 {! A% \2 A, ^1 {4 @1 l; _3 i6 W6 B
[root@log-server ~]# cat /etc/logrotate.conf! ~# e! ^" m! x/ t
# see "man logrotate" for details
. F4 V. k' @. h& R3 c# rotate log files weekly
) y% [7 h5 z" J" `2 [* wweekly
2 ], X/ v$ o+ m0 q, h5 U# d% l' z1 B3 T' W: y+ Q- }1 \
# keep 4 weeks worth of backlogs        保留4周备份日志
8 i) Q/ b& p+ u; B8 Trotate 41 j" A0 I6 Z" Y( M2 z- O/ r$ X
, ~! d) y" s; J
# create new (empty) log files after rotating old ones. K" T1 s* m& V5 ?$ A6 z& j' w
create
5 E6 {) J* Z+ |$ I5 D" N4 H: V% `) h& M0 n
# use date as a suffix of the rotated file                日期作为后缀给旧文件重命名
5 V3 n6 v+ B# O9 Y0 k4 bdateext
" E! B5 J# A' G$ c& D
* d& }3 x+ I0 j" Q/ L$ v! p! Y9 z# uncomment this if you want your log files compressed/ k3 J- _3 k3 u
#compress+ @% \& k( w5 Y+ R  W' c0 B

& q& Q7 C. P% E  M# RPM packages drop log rotation information into this directory
3 s/ ~- J8 w+ d7 kinclude /etc/logrotate.d        加载外部目录* _; [( y2 h# v3 q* f2 V
7 _# N$ _5 S& i3 i  Y  N
# no packages own wtmp and btmp -- we'll rotate them here
8 v, F$ S7 y) j$ W0 V/var/log/wtmp {# ?0 v" N% I9 d; }* @4 W4 K
    monthly6 v+ d) f2 q0 g7 {+ c! C1 B5 @2 Q
    create 0664 root utmp                , p1 F6 v+ k) _; J1 |+ c: L
        minsize 1M( `6 R4 x% b9 ]- i
    rotate 1        保留1份日志文件,每一个月备份一次日志文件
+ A. f4 a! ]6 B1 ~' y0 r}
" ]: i' y5 |" V! J: y1 M& U9 H  H+ o  g- U0 W, E8 V8 N0 J
/var/log/btmp {; E# H. m/ c. e' T8 x+ {
    missingok
" r8 H  n5 z4 S5 r+ m; N    monthly: @2 c# U, v% x; C) ?
    create 0600 root utmp
3 l) W4 H- l7 g& p; s& V* b% @    rotate 11 z& d4 ]' F3 D% g5 V2 y
}
8 j3 j: H  @5 m# y
$ v8 o9 ^! s- ^+ [# system-specific logs may be also be configured here.
9 U1 T7 E' |8 I4 `4 g
3 m' I4 g- i- [* a0 C- `常见的一些参数:
" K: t0 c' \% P1 I4 l  N/ ^daily                指定转储周期为每天
8 M; s" E! `6 Q0 z; W: O7 qmonthly                指定转储周期为每月
; q! o) M+ e, u7 h7 {weekly                每周轮转一次+ K0 ^$ F& r3 c1 P
rotate 4        同一个文件最多轮转4次,4次之后就删除该文件$ ]6 [8 v8 L" y* e# G9 H
create 0664 root uttmp        轮转之后创建新文件,权限是0664,属于root用户和utmp组! v& f1 h: a  ^+ f# b
dateext                用日期来做轮转之后的文件的后缀名& J& L9 L: e4 H5 B& b
compress        用gzip对轮转后的日志进行压缩/ Z3 o: c( G) |% r
minsize        30K        文件必须大于30k,且周期到了,才会轮转
5 O. s6 u5 v  d$ Y1 wsize 30K        文件大于30k才会轮转,不论周期是否已到
: o( J. }4 L  u& [5 R$ Xmissingok        如果日志文件不存在,不报错
- r) f! ^- ]- o0 Anotifempty        如果日志文件是空的,不轮转
5 d7 N" E3 V, O4 i2 C5 [delaycompress        下一次轮转的时候才压缩2 h" F8 Z: q: |6 A# p1 h6 s
sharedscripts        不管有多少个文件待轮转,prerotate和postrotate代码只执行一次! o4 `9 s( n" e  Y9 m* p" i
prerotate                如果符合轮转的条件,则在轮转之前执行prerotate和endscript之间的shell代码
1 U" C$ }, y' x+ mpostrotate                轮转完成后执行postrotate和endscript之间的shell代码
& c8 A/ Z# N! _1 Z% s1 `0 V# e: K# b
[root@server~]# cat /etc/logrotate.d/syslog
% G( @, _; q. a& f2 y# K9 C这个子配置文件,没有指定的参数都会以默认方式轮转
  ?+ V  J1 {* f# {/ V/var/log/cron: o4 [( O6 K. t! @" _% b. D
/var/log/maillog* ]' i; N  c0 N2 o$ g+ U$ e; ^* T
/var/log/messages+ j" G# E" t  j
/var/log/secure: f/ X8 I. ~" p+ p% c# l$ D: ~
/var/log/spooler
" d% _7 Y6 N* o6 Y{4 [7 Q5 l9 M0 J" ^
    sharedscripts        不管有多少个文件待轮转,prerotate和postrotate代码只执行一次
, K% z6 j% x1 C* {" z2 A    postrotate                转换完后执行postrotate和endscirpt之间的shell代码
! O4 ]6 X# V$ r; x" A5 x% |3 V        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true* P6 f; t- |8 \, B
        轮转后对rsyslog的pid进行刷新(但pid其实不变)+ N9 S/ ^* z6 `$ u# C0 \1 u1 a
    endscript
4 @) [; |4 m* _' _}
" G; K& R: o' V# g9 Q思考:为什么轮转后需要对rsyslog的pid进行刷新?
' |3 j/ M- \" v, Z* U% jll -i 查看文件的inode        ) n2 F; N) O' m
-HUP 平滑重启
. k+ J" v" W3 w3 l- J
7 P3 R3 Q% Q" t+ D- f) @: C2 A, h, E/ ?
! E" K# }! W* r7 Y/ n( i

0 a4 e# d+ k$ o7 C6 T: m8 s( c4 W* d$ B0 W
不以时间为后缀进行轮转,在/etc/logrotate.conf/ nodateext
+ P* N3 k  J  b
4 ]4 y: B5 ^! p4 ^" T1 m% O清空环境
' ~) }2 Y2 X# G
- g$ \* Q+ s: ?重启服务
/ ^: f2 |6 A' z2 u2 R. W% F9 b" `2 j* p+ v3 \

# {8 _% i2 S# [7 L/ \8 r
5 z) _/ a- A& A0 P
8 m$ y3 u- g+ k" P2 T8 W% F. @! g3 C0 P, p( J3 x
结论
8 S) U3 y% a3 u' f$ @0 R. M- J2 M: ?8 o1 @$ W/ u' D
后刷新pid的话,logger -t "呵呵" "再见!"会写入旧文件(messages.1)里面- m( m# d/ I1 F6 g* O, l; O
- Q# K8 \( B; _' X/ L
将这句话放在/bin/kill这条命令后面,会写入新文件里& |/ I9 h7 l( q8 z" j* B
$ m4 }* c) s0 e* w
最新的文件是messages,第一次强制轮转后的旧文件是messages.1,cat messages.1会看到logger -t "呵呵" "再见!",到第二次就成messages.2。而第二次轮转后的messages.1成了第一次轮转后的messages的老文件。(看时间区别)
: w+ L+ O- O$ C9 U( E: j6 `' M$ n8 m/ T9 t1 U
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-9 00:02 , Processed in 0.062589 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表