cacti下syslog插件安装&&syslog-ng统一管理日志

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

实验目标

syslog-ng过滤日志并转存到日志服务器上

通过cactisyslog插件将日志web显示

实验环境

Gentoo 3.8.13系统

预安装LAMP ssh

需要软件

syslog-ng## gentoo系统自带

其他需求

Gentoo的安装

Cacti的安装

LAMP环境安装

参考blog相关文章

http://chengchow.blog.51cto.com/all/1642666

服务器需求

至少2台服务器,下面测试我用了4台,相关信息如下:

IP地址

主机名称

主机编号

192.168.254.123

syslog

1

192.168.254.81

namenode

2

192.168.254.84

datanode

3

192.168.254.85

tasktracker(datanode2)

4

192.168.254.1

**-***-**(my windows)

5

参考文档

Syslog-ng安装配置

http://wenku.baidu.com/view/6a502e7d168884868762d648.html


实验步骤

syslog服务器配置

Syslog-ng的安装

在主机1

如果没有安装syslog-ng

Shell>USE=”sql” emerge syslog-ng

Shell>/etc/init.d/syslog-ng start

Shell>rc-update add syslog-ng default

Shell>emerge event-log

配置 syslog-ng.conf文件

Shell> cat /etc/syslog-ng/syslog-ng.conf

       1        

       2        

       3        

       4        

       5        

       6        

       7        

       8        

       9        

       10        

       11        

       12        

       13        

       14        

       15        

       16        

       17        

       18        

       19        

       20        

       21        

       22        

       23        

       24        

       25        

       26        

       27        

       28        

       29        

       30        

       31        

       32        

       33        

       34        

       35        

       36        

       37        

       38        

       39        

       40        

       41        

       42        

       43        

       44        

       45        

       46        

       47        

       48        

       49        

       50        

       51        

       52        

       53        

       54        

       55        

       56        

       57        

       58        

       59        

       60        

       61        

       62        

       63        

       64        

       65        

       66        

       67        

       68        

       69        

       70        

       71        

       72        

       73        

       74        

       75        

       76        

       77        

       78        

       79        

       80        

       81        

       82        

       83        

       84        

       85        

       86        

       87        

       88        

       89        

       90        

       91        

       92        

       93        

       94        

       95        

       96        

       97        

       98        

       99        

       100        

@version: 3.2

#

# configuration file for syslog-ng, customized for remote logging

#

options {

use_fqdn(yes);

chain_hostnames(off);

keep_hostname(off);

flush_lines(0);

# The default action of syslog-ng 1.6.0 is to log a STATS line

# to the file every 10 minutes.  That's pretty ugly after a while.

# Change it to every 12 hours so you get a nice daily update of

# how many messages syslog-ng missed (0).

stats_freq(43200);

create_dirs(yes);

};

source src {

unix-stream("/dev/log" max-connections(256));

internal();

file("/proc/kmsg");

};

destination messages { file("/var/log/messages"); };

destination console_all { file("/dev/tty12"); };

source s_internal { internal(); };

destination d_syslognglog { file("/var/log/syslog-ng.log"); };

log { source(s_internal); destination(d_syslognglog); };

source s_sys { file ("/proc/kmsg" program_override("kernel: ")); unix-stream ("/dev/log"); internal(); };

destination d_cons { file("/dev/console"); };

destination d_mesg { file("/var/log/messages"); };

destination d_auth { file("/var/log/secure"); };

destination d_mail { file("/var/log/maillog"); };

destination d_spol { file("/var/log/spooler"); };

destination d_boot { file("/var/log/boot.log"); };

destination d_cron { file("/var/log/cron"); };

destination d_rsync { file("/var/log/rsync"); };

destination d_mlal { usertty("*"); };

filter f_filter1     { facility(kern); };

filter f_filter2     { level(info) and

not (facility(mail)

or facility(authpriv) or facility(cron)); };

filter f_filter3     { facility(authpriv); };

filter f_filter4     { facility(mail); };

filter f_filter5     { level(emerg); };

filter f_filter6     { facility(uucp) or

(facility(news) and level(crit)); };

filter f_filter7     { facility(local7); };

filter f_filter8     { facility(cron); };

filter f_filter9     { facility(daemon); };

filter f_filter10     { facility(local6); };

#log { source(s_sys); filter(f_filter1); destination(d_cons); };

#log { source(s_sys); filter(f_filter2); destination(d_mesg); };

#log { source(s_sys); filter(f_filter3); destination(d_auth); };

#log { source(s_sys); filter(f_filter4); destination(d_mail); };

#log { source(s_sys); filter(f_filter5); destination(d_mlal); };

#log { source(s_sys); filter(f_filter6); destination(d_spol); };

#log { source(s_sys); filter(f_filter7); destination(d_boot); };

#log { source(s_sys); filter(f_filter8); destination(d_cron); };

# Remote logging

source s_remote {

udp(ip(0.0.0.0) port(514));

};

destination r_mesg { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_auth { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/secure" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_mail { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/maillog" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_spol { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/spooler" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_boot { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/boot.log" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_cron { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/cron" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_daemon { file("/var/log/syslog-ng/$YEAR/$MONTH/$HOST/daemon" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

destination r_local6 { file("/var/log/syslog-ng/$YEAR/$MONTH/network/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };

#destination d_separatedbyhosts {

#       file("/var/log/syslog-ng/$HOST/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes));

#};

#log { source(s_remote); destination(d_separatedbyhosts); };

log { source(s_remote); filter(f_filter2); destination(r_mesg); };

log { source(s_remote); filter(f_filter3); destination(r_auth); };

log { source(s_remote); filter(f_filter4); destination(r_mail); };

log { source(s_remote); filter(f_filter6); destination(r_spol); };

log { source(s_remote); filter(f_filter7); destination(r_boot); };

log { source(s_remote); filter(f_filter8); destination(r_cron); };

log { source(s_remote); filter(f_filter9); destination(r_daemon); };

log { source(s_remote); filter(f_filter10); destination(r_local6); };

## cacti settings

# cacti local settings

destination d_mysql {

pipe("/tmp/mysql.pipe"

template("INSERT INTO syslog_incoming(host,facility,priority,date,time,message) VALUES('$HOST','$FACILITY','$PRIORITY','$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC','$MSG');\n")

template-escape(yes));

};

log{ source(s_remote);destination(d_mysql); };

log{ source(s_sys);destination(d_mysql); };

# cacti remote settings

#destination r_mysql {

#        pipe("/tmp/mysql.pipe" owner("root") group("root")

#   template("INSERT INTO syslog_incoming(host,facility,priority,date,time,message) VALUES('$HOST','$FACILITY','$PRIORITY','$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC','$MSG');\n")

#   template-escape(yes));

#};

#log { source(s_remote); destination(r_mysql); };

## client settings

destination d_udp { udp ("192.168.254.123" port(514)); };

log { source(src);destination(d_udp); };

这里编写的比较乱,是用了Ubuntu syslog-ng自带的配置文件做的修改,本地日志生成被我停掉了,所有日志都是通514端口获取,包括syslog服务器的日志,具体配置文件的说明参见附件3

添加IP地址对应主机名称解析

DNS服务器不需要

Shell>vi /etc/hosts

wKioL1NPTiqSai1aAACQ9g_5c2w805.jpg

客户端配置

2-4

如果没有安装syslog-ng

Shell>emerge syslog-ng

Shell>/etc/init.d/syslog-ng start

Shell>rc-update add syslog-ng default

配置syslog-ng.conf文件

Shell>echo “destination d_udp { udp(“192.168.254.123”prot(514)); }; ” >>/etc/syslog-ng/syslog-ng.conf

Shell>echo “log { source(src);destination(d_udp); };” >> /etc/syslog-ng/syslog-ng.conf

Shell>cat /etc/syslog-ng/syslog-ng.conf

wKiom1NPTpLQ-Dq5AABT8v3izj8063.jpg

具体配置的说明参考附件3

这里source(src)默认配置自带

重启syslog服务

1-4

Shell> /etc/init.d/syslog-ng restart

到这里syslog服务器就配置完成了

测试

配置完成去主机1上,进入syslog-ng日志目录,如下

wKiom1NPTrDigvgbAABbOSqwL78477.jpg

可以看到对应的服务器日志文件夹,这里我们用主机2测试,打开 secure(登录验证日志)

Shell>tail -f /var/log/syslog-ng/2014/04/namenode/secure

另外在开一个终端,登录主机2,如果日志有变化,则说明配置成功

wKioL1NPTpDC5-m9AACbyqtG07I705.jpg

Message/daemon/cron测试日志同上

Message系统日志

Daemon服务开启/关闭日志

Secure用户验证日志

Cron计划任务日志

Windows客户端配置

Windows服务器不支持日志服务器,需要安装一个转换软件evtsys
下载地址为:
http://down.51cto.com/tag-evtsys.html

根据系统的版本下载32位和64位的程序。
解压后是两个文件evtsys.dllevtsys.exe
把这两个文件拷贝到 c:\windows\system32目录下。

以下操作在CMD

安装evtsys服务
C:\>evtsys –i –h 192.168.254.123 –p 514
-i
表示安装成系统服务
-h 指定log服务器的IP地址

-p 指定端口

详细参数使用evtsys /?查看

启动evtsys

C:\net start evtsys

停止 evtsys

c:\net stop evtsys

卸载evtsys
evtsys –u

效果如下

wKioL1NPTp-BVeRDAAOnro0NkVY168.jpg

这里有个中文字体会转码的问题,如上图操作”View”à”Encoding”à”Unicode(UTF-8)”.

cacti syslog插件安装配置

关于cacti配置及cacti syslog插件的安装,参考之前的笔记

http://chengchow.blog.51cto.com/all/1642666

下面主要说用cacti syslog插件读取syslog日志

Cacti for syslog的安装目录

wKioL1NPTr_hYnxvAAF0eko2BmY401.jpg

先配置下权限问题

Shell> cd /var/www/localhost/htdocs/cacti/plugins/syslog

Shell> chmod –R 755 +x ../syslog

Shell> chown –R cactiuser:cactiuser ../syslog

Syslog数据库导入

这里有两种方法

方法1利用原来的cacti数据(优点是不需要另外创建数据库,缺点是日志文件太多,不方便管理)

Shell> mysql –uroot –p cactidb < syslog.sql

方法2新建立个数据库管理

Shell> mysql –uroot –p

mysql> create databse syslogdb;

mysql>grant all privileges on syslogdb.* to ‘sysloguser’@’localhost’ indentify by ‘syslogpass’;

mysql>quit

shell> mysql –uroot –p syslogdb < syslog.sql

这里用方法1

Cacti for syslog配置文件修改

Shell> vi ./config.php

wKiom1NPTvaw2bCoAAHAlG3xGRg569.jpg

注意箭头部分,true是使用cactidb数据库,false是使用自建数据库

同步日志的到数据库脚本

Shell> cat ./syslog2mysql.sh

       1        

       2        

       3        

       4        

       5        

       6        

       7        

       8        

       9        

#!/bin/bash

if [ ! -e /tmp/mysql.pipe ];then

mkfifo /tmp/mysql.pipe

fi

while [ -e /tmp/mysql.pipe ]

do

mysql -ucactiuser -pcactipass cactidb < /tmp/mysql.pipe

done

exit 0

运行脚本,一个死循环,需要在后台运行

Shell> nohup ./syslog2mysql.sh &

注意,脚本里面的临时文件路径,必须是在syslog-ng.conf里面destination配置路径

添加计划任务

Shell> vi /etc/crontab

wKiom1NPTxKiI4aBAABs16qnkuU108.jpg

这里为了测试方便,改成了1分钟获取一次数据,时间日志同步建议和cacti获取时间同步

登录cacti界面

“console”à”configuration”à”plugins management”会出现如下界面

如果没有如下界面也没关系,删除syslog插件重新登录,按照以上步骤就会出现,主要是一些参数的选择

wKioL1NPTvjTms_bAAN5XF6iLVU561.jpg

第一个选项有MyISAMInnodb两种数据库类型,建议选innodb.

第二个是数据库结构,5.5以上可以直接选择partitioined table5.1.6以下不支持.

第三个是日志保存时间,最大为1.

第一次登录好像还有个参数,没留意什么,直接默认安装了

如果不清楚选项含义,可以全部默认,默认配置性能上不能达到最优,兼容性最好,选择完成点击Install按钮安装。

安装完成,如果有安装clog插件的,顺便看下cacti日志是否有报错;

如果没有错误,继续;

1-4上面做服务重启或者登录的操作,等待几分钟,点击syslog页面查看,如下界面。

wKiom1NPTzbjrQbmAAcS2mpwQUc580.jpg

1选择页面

2主机名称

3过滤选项

4日志内容

5日志等级颜色标志

附件1syslog日志获取流程

wKiom1NPT8LA0-gUAAM4WQMpztQ952.jpg

附件2cacti for syslog日志获取流程

wKioL1NPT7KC7fQJAAL5Jhq7jpk382.jpg

附件3 syslog-ng.conf配置简单介绍

Syslog-ng.conf一共有5个字段(1-5

1.Option { };

全局选项

选项格式

options { opt1; opt2; ... };

选项:

chain_hostnames(yes|no) :是否打开主机名链功能,打开后可在多网络段转发日志时有效

long_hostnames(yes|no) :是chain_hostnames的别名,已不建议使用

keep_hostname(yes|no) :是否保留日志消息中保存的主机名称,否时,总是使用来源主机来作重写日志的主机名

use_dns(yes|no) :是否打开DNS查询功能,应使用防火墙保护使用syslog-ng的节点安全,并确认所有主机都是可以通过dns解释的,否则请关闭该选项。

use_fqdn(yes|no) :是否使用完整的域名

check_hostname(yes|no) :是否检查主机名有没有包含不合法的字符

bad_hostname(regexp) :可通过正规表达式指定某主机的信息不被接受

dns_cache(yes|no) :是否打开DNS缓存功能

dns_cache_expire(n) DNS缓存功能打开时,一个成功缓存的过期时间

dns_cache_expire_failed(n) DNS缓存功能打开时,一个失败缓存的过期时间

dns_cache_size(n) DNS缓存保留的主机名数量

create_dirs(yes|no) :当指定的目标目录不存在时,是否创建该目录

dir_owner(uid) :目录的UID

dir_group(gid) :目录的GID

dir_perm(perm) :目录的权限,使用八进制方式标注,例如0644

owner(uid) :文件的UID

group(gid) :文件的GID

perm(perm) :文件的权限,同样,使用八进制方式标注

gc_busy_threshold(n) :当syslog-ng忙时,其进入垃圾信息收集状态的时间。一旦分派的对象达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是:3000

gc_idle_threshold(n) :当syslog-ng空闲时,其进入垃圾信息收集状态的时间。一旦被分派的对象到达这个数字,syslog-ng就会启动垃圾信息收集状态,默认值是:100

log_fifo_size(n) :输出队列的行数

log_msg_size(n) :消息日志的最大值(bytes

mark(n) :多少时间(秒)写入两行MARK信息供参考,目前没有实现

stats(n) :多少时间(秒)写入两行STATUS信息供,默认值是:600

sync(n) :缓存多少行的信息再写入文件中,0为不缓存,局部参数可以覆盖该值。

time_reap(n) :在没有消息前,到达多少秒,即关闭该文件的连接

time_reopen(n) :对于死连接,到达多少秒,会重新连接

use_time_recvd(yes|no) :宏产生的时间是使用接受到的时间,还是日志中记录的时间;建议使用R_的宏代替接收时间,S_的宏代替日志记录的时间,而不要依靠该值定义。

2.Source { };

source  { 日志源; 日志源; ... };

#日志源可用参数:

file (filename) 从指定的文件读取日志信息

unix-dgram(filename) SOCK_DGRAM模式的unix套接字接收日志消息

unix-stream (filename) SOCK_STREAM模式的unix套接字接收日志消息

udp ( (ip),(port) ) :从UDP端口接收日志

tcp ( (ip),(port) ) TCP端口接收日志

internal() syslog-ng内部产生的日志

pipe(filename),fifo(filename) 从指定的管道或者FIFO设备,读取日志信息可以同

时配置多个日志,

经典应用

source s_sys { file ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); };

3.Filter { };

filter  { 过滤参数; };

#过滤参数可用:

facility(,)根据facility(设备)选择日志消息,使用逗号分割多个facilitylevel(,)

level(优先级)选择日志消息,使用逗号分割多个level,或使用“..表示一个范围

program(regexp)日志消息的程序名是否匹配一个正则表达式

host(regexp)日志消息的主机名是否和一个正则表达式匹配

match(regexp)对日志消息的内容进行正则匹配

filter()调用另一条过滤规则并判断它的值

#过滤参数操作式:

And

or

not

#facility(设备)可用消息类型

Auth用户认证

authpriv有特权的用户认证

croncron守护进程

daemon各种系统守护进程

ftpftp守护进程

kern内核消息

local0-local7保留用于本地用法

lpr打印机

mail邮件

news新闻

syslog内部syslog

uucpuucp系统

user各种用户程序来的消息

cactifilter参数查询的分类

wKioL1NPT_DgM5UwAAA3pQiDKSo801.jpg

#Level等级:

emerg最严重的错误 (system panic)

alert需要立即处理的严重错误

critcritical warming

err普通错误

warn警告信息

notice比较不严重的信息

info普通信息

debug除错信息

cactifileter等级查询的分类

wKiom1NPUAqxGivuAABgTyGps7o230.jpg

4.Destination { };

destination  { 目标操作; 目标操作;...;};

#目标操作常用参数:

file (filename) :写入指定文件

unix-dgram(filename) :写入SOCK_DGRAM模式的unix套接字

unix-stream (filename) :写入SOCK_STREAM模式的unix套接字

tcp(ip),(port) :以TCP协议发送指定主机端口

udp (ip),(port) :以UDP协议发送指定主机端口

usertty(username) :把日志消息发送到已经登陆的指定用户终端

pipe(filename),fifo(filename):把日志消息发送到指定管道或FIFO设备

program(parm) :启动指定的程序,并把日志消息发送到该进程的标准输入

5.Log { };

日志生成

格式

Log {source filter destination };

Filter可以省略,不过滤日志。

6.扩展file部分函数的参数

syslog-ng除了有全局选项参数外,不同的函数还可以定义其参数,其中包括:

6.1、扩展file的宏

HOST 日志消息的源发主机名。如果日志消息穿过几个主机,并且chain_hostname()功能已经打开,就使用第一个主机名。

FACILITY :日志消息来自的日志设备

PRIOPRITY/LEVEL :日志消息的优先级

PROGRAM :发送日志消息的程序

YEAR :发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间。这由use_time_recvd()选项控制

MONTH :发送日志消息的月份

DAY :发送日志消息的日子

HOUR :小时

MIN 分钟

SEC :秒

6.2file的参数

log_file_size()日志文件大小

program_override()原来的sync参数

owner()日志文件用户

perm()日志文件权限

group()日志文件用户组

dir_perm()日志文件夹权限

create_dir ()自动创建文件夹

6.3tcpupd的参数

ipxxx.xxx.xxx.xxx):定义绑定的IP地址

portn):定义绑定的端口

max-connectionsn定义最大连接数

TCP基于连接方式传输,不会造成日志丢失,而UDP则不同。但因为传统的syslog基于UDP514端口,所以,UDP方式也经常会使用到。

另外,514也是rshell的默认端口,请注意冲突。

实验文档使用的就是udp连接










本文转自 chengchow 51CTO博客,原文链接:http://blog.51cto.com/chengchow/1397007,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5月前
|
监控 Ubuntu 安全
如何在 VPS 上安装和使用 Logwatch 日志分析器和报告工具
如何在 VPS 上安装和使用 Logwatch 日志分析器和报告工具
65 1
|
5月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
153 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
102 0
|
5月前
|
存储 网络协议 Linux
在Linux中,如何通过syslog进行远程日志转发?
在Linux中,如何通过syslog进行远程日志转发?
|
5月前
|
NoSQL Ubuntu Java
如何在 Ubuntu 14.04 上安装 Graylog2 并实现日志集中管理
如何在 Ubuntu 14.04 上安装 Graylog2 并实现日志集中管理
47 1
|
5月前
|
运维 监控 Ubuntu
一键启动日志魔法:揭秘ELK自动安装脚本的神秘面纱!
【8月更文挑战第9天】在数据驱动时代,高效处理日志至关重要。ELK Stack(Elasticsearch、Logstash、Kibana)是强大的日志分析工具,但其复杂的安装配置常让初学者望而却步。本文介绍如何编写ELK自动安装脚本,简化部署流程。脚本适用于Ubuntu系统,自动完成ELK下载、安装及基本配置,包括依赖项安装、服务启动及自启设置,极大降低了使用门槛,助力运维人员和开发者轻松构建日志分析平台。
183 6
|
5月前
|
XML 数据格式 Windows
【Azure 云服务】Azure Cloud Service (Extended Support) 云服务开启诊断日志插件 WAD Extension (Windows Azure Diagnostic) 无法正常工作的原因
【Azure 云服务】Azure Cloud Service (Extended Support) 云服务开启诊断日志插件 WAD Extension (Windows Azure Diagnostic) 无法正常工作的原因
|
6月前
|
SQL 监控 Java
IDEA插件-Mybatis Log Free日志替换
MyBatis Log Free 是一个免费的用于在 IntelliJ IDEA 中显示 MyBatis 日志的插件。它可以帮助您更方便地查看和分析 MyBatis 的 SQL 执行情况,以及定位潜在的性能问题,提高开发效率。
517 0
IDEA插件-Mybatis Log Free日志替换
|
6月前
|
SQL 监控 Java
IDEA插件-Mybatis Log Free日志替换
MyBatis Log Free 是一个免费的用于在 IntelliJ IDEA 中显示 MyBatis 日志的插件。它可以帮助您更方便地查看和分析 MyBatis 的 SQL 执行情况,以及定位潜在的性能问题,提高开发效率。
425 0
IDEA插件-Mybatis Log Free日志替换
|
7月前
Liunx怎么安装spdlog(这是用来管理日志部分)
Liunx怎么安装spdlog(这是用来管理日志部分)
152 7