㈠ linux 下python 脚本编写的"奇技淫巧"
“ 生命完美的答案,无非走过没有遗憾 ---《天蓝》”
“如何能够解析脚本运行命令行选项(位于 sys.argv 中)”
argparse 模块可被用来解析命令行选项
常用来定义一个脚本的说明文档,一般我们写python脚本会通过 if..else 的方式来提供一个脚本说明文档,python不支持switch。所以很麻烦,其实,我们可以通过 argparse 来编写说明文档。
我们来看看怎么执行一个python脚本
对于熟悉Linux的小伙伴下面的文档在熟悉不过了,这个一个标准Linxu软件包的说明文档,文档中定义是软件包的说明
来看看这个脚本是如何编写的
为了解析命令行选项, 首先要创建一个 ArgumentParser 实例, 使用 add_argument() 方法声明你想要支持的选项。在每个 add-argument() 调用中:
dest 参数指定解析结果被指派给属性的名字。 metavar 参数被用来生成帮助信息。
action 参数 指定跟属性对应的处理逻辑,通常的 值为 store , 被用来存储 某个值 或将 多个参数值收集到一个列表中 。
nargs 参数收集 所有剩余的命令行参数到一个列表中。在本例中它被用来构造一个文件名列表
action='store_true' 根据参数是否存在来设置一个位置 Boolean 标志:
action='store' 参数接受一个单独值并将其存储为一个字符串
如果一个都没有,会提示缺少参数 -p/--pat
choices={'slow', 'fast'}, 参数说明接受一个值,但是会将其和可能的选择值做比较,以检测其合法性:
一旦参数选项被指定,你就可以执行 parser.parse() 方法了。它会处理 sys.argv 的值并返回一个结果实例。每个参数值会被设置成该实例中 add_argument() 方法的 dest 参数指定的属性值。
还很多种其他方法解析命令行选项。可以会手动地处理 sys.argv 或者使用 getopt 模块 。但是,如果你采用本节的方式,将会减少很多冗余代码,底层细节 argparse 模块 已经帮你处理好了。你可能还会碰到使用 optparse 库解析选项的代码。尽管 optparse 和 argparse 很像 ,但是后者更先进,因此在新的程序中你应该使用它。
“你写了个脚本,运行时需要一个密码。此脚本是交互式的,因此不能将密码在脚本中硬编码,而是需要弹出一个密码输入提示,让用户自己输入。”
Python 的 getpass 模块 正是你所需要的。你可以让你很轻松地弹出密码输入提示,并且不会在用户终端显示密码。
代码中 getpass.getuser() 不会弹出用户名的输入提示。它会根据该 用户的 shell 环境 或者会依据 本地系统的密码库 (支持 pwd 模块的平台)来使用 当前用户的登录名
在bash中编写pytohn脚本接收外部数据的方式,一般情况下,对于一般变量,我们用命令行变量的方式比较多(手动的处理 sys.argv ),对于 文件内容或者bash命令输出 直接通过脚本内部获取需要的数据。
其实python 脚本也可以用其他方式来接收 传递给他的 文件数据或者bash命令输出 ,包括将 命令行的输出 通过 管道传递 给该脚本、 重定向文件到该脚本 ,或在 命令行中传递一个文件名 或 文件名列表 给该脚本。
这里通过 Python 内置的 fileinput 模块 ,可以实现重 定向,管道,以文佳输出 的方式传递数据到脚本内部
使用 fileinput.input() 方法可以获取当前输入脚本的数据,脚本里面用一个 FileInput 迭代器接收
文件直接接收
重定向接收
管道方式接收
fileinput.input() 创建并返回一个 FileInput 类的实例,该实例可以被当做一个 上下文管理器 使用。因此,整合起来,如果我们要写一个打印多个文件输出的脚本,那么我们需要在输出中包含文件名和行号
“你想执行一个外部命令并以 Python 字符串的形式获取执行结果。”
使用 subprocess.check_output() 函数。
执行下试试
如果被执行的命令以非零码返回,就会抛出异常。下面的例子捕获到错误并获取返回码:
默认情况下, check_output() 仅仅返回输入到标准输出的值。如果你需要 同时收集标准输出和错误输出 ,使用 stderr 参数:
如果你需要用一个超时机制来执行命令,使用 timeout 参数:
通常来讲,命令的执行 不需要 使用到 底层 shell 环境(比如 sh、bash) 。一个字符串行表会被传递给一个 低级系统命令 ,比如 os.execve() 。
如果你想让 命令被一个shell 执行 ,传递一个字符串参数,并设置参数 shell=True . 有时候你想要 Python 去执行一个复杂的 shell 命令 的时候这个就很有用了,比如管道流、I/O 重定向和其他特性。例如:
是在 shell 中执行命令会存在一定的安全风险,特别是当参数来自于用户输入时。这时候可以使用 shlex.quote() 函数 来将参数正确的用双引用引起来。
使用 check_output() 函数 是执行 外部命令 并获取其 返回值 的最简单方式。但是,如果你需要对 子进程做更复杂的交互 ,比如给它发送输入,你得采用另外一种方法。这时候可直接使用 subprocess.Popen 类。
关于子进程,简单来看下
也可以进程列表同协程结合的方式。你既可以在子shell中 进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。
如果直接丢到后台会自动在终端输出IO
subprocess 模块对于依赖 TTY 的外部命令不合适用 。例如,你不能使用它来自动化一个用户输入密码的任务(比如一个 ssh 会话)。这时候,你需要使用到第三方模块了,比如基于着名的 expect 家族的工具(pexpect 或类似的)(pexpect可以理解为Linux下的expect的Python封装、通过pexpect可以实现对ssh、ftp、passwd、telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的。比如我们可以模拟一个FTP登录时所有交互,包括输入主机地址、用户名、密码、上传文件等,待出现异常还可以进行尝试自动处理。)
“你想向标准错误打印一条消息并返回某个非零状态码来终止程序运行”
通过 python 的 raise SystemExit(3) 命令可以主动抛出一个错误,通过 sys.stderr.write 将命令写到标准的输出端
直接将消息作为参数传给 SystemExit() ,那么你可以省略其他步骤
抛出一个 SystemExit 异常,使用错误消息作为参数,它会将消息在 sys.stderr 中打印,然后程序以状态码 1 退出
“你需要知道当前终端的大小以便正确的格式化输出。”
使用 os.get terminal size() 函数 来做到这一点。
“复制或移动文件和目录,但是又不想调用 shell 命令。”
shutil 模块 有很多便捷的函数可以复制文件和目录。使用起来非常简单
这里不多讲,熟悉Linux的小伙伴应该不陌生。
默认情况下,对于 符号链接 这些命令处理的是它指向的东西文件。例如,如果 源文件 是一个 符号链接 ,那么目标文件将会是 符号链接 指向的文件。如果你只想 复制符号链接本身 ,那么需要指定 关键字 参数 follow_symlinks
tree() 可以让你在复制过程中选择性的忽略某些文件或目录。你可以提供一个忽略函数,接受一个目录名和文件名列表作为输入,返回一个忽略的名称列表。例如:
对于文件元数据信息, 2() 这样的函数只能尽自己最大能力来保留它。 访问时间、创建时间和权限 这些基本信息会被保留,但是 对于所有者、ACLs、资源 fork 和其他更深层次的文件元信息就说不准了
通常不会去使用 shutil.tree() 函数 来执行 系统备份 。当处理文件名的时候,最好使用 os.path 中的函数来确保最大的可移植性
使用 tree() 复制文件夹的一个棘手的问题是对于错误的处理,可以使用异常块处理,或者通过 参数 ignore dangling symlinks=True 忽略掉无效符号链接。
“创建或解压常见格式的归档文件(比如.tar, .tgz 或.zip)”
shutil 模块拥有两个函数—— make archive() 和 unpack archive() 可派上用场,
make archive() 的第二个参数是期望的输出格式。可以使用 get archive formats() 获取所有支持的归档格式列表。
“你需要写一个涉及到文件查找操作的脚本,比如对日志归档文件的重命名工具,你不想在 Python 脚本中调用 shell,或者你要实现一些 shell 不能做的功能。”
查找文件,可使用 os.walk() 函数 ,传一个顶级目录名给它
os.walk() 方法 为我们 遍历目录树 ,每次进入一个目录,它会返回一个 三元组 ,包含 相对于查找目录的相对路径,一个该目录下的目录名列表,以及那个目录下面的文件名列表。
对于每个元组,只需检测一下目标文件名是否在文件列表中。如果是就使用 os.path.join() 合并路径。为了避免奇怪的路径名比如 ././foo//bar ,使用了另外两个函数来修正结果
os.walk(start) 还有跨平台的优势。并且,还能很轻松的加入其他的功能。我们再演示一个例子,下面的函数打印所有最近被修改过的文件:
打印10分钟之前被修改的数据
“怎样读取普通.ini 格式的配置文件?”
configparser 模块 能被用来读取配置文件
编写配置文件
如果有需要,你还能修改配置并使用 cfg.write() 方法将其写回到文件中
“你希望在脚本和程序中将诊断信息写入日志文件。”
python 脚本打印日志最简单方式是使用 logging 模块
五个日志调用( critical(), error(), warning(), info(), debug() )以降序方式表示不同的严重级别。 basicConfig() 的 level 参数是一个 过滤器 。所有级别低于此级别的日志消息都会被忽略掉。每个 logging 操作的参数是一个消息字符串,后面再跟一个或多个参数。构造最终的日志消息的时候我们使用了 % 操作符来格式化消息字符串。
如果你想使用配置文件,可以像下面这样修改 basicConfig() 调用:
logconfig.ini
在调用日志操作前先执行下 basicConfig() 函数方法 ,可以找标准输出或者文件中输出
basicConfig() 在程序中只能被执行一次。如果你稍后想改变日志配置,就需要先获取 root logger ,然后直接修改它。
更多见日志模块文档https://docs.python.org/3/howto/logging-cookbook.html
“你想给某个函数库增加日志功能,但是又不能影响到那些不使用日志功能的程序。”
对于想要执行日志操作的函数库,你应该创建一个专属的 logger 对象,并且像下面这样初始化配置:
使用这个配置,默认情况下不会打印日志,只有配置过日志系统,那么日志消息打印就开始生效
通常来讲,不应该在函数库代码中 自己配置日志系统 ,或者是已经有个已经存在的日志配置了。调用 getLogger( name ) 创建一个和调用模块同名的 logger 模块 。由于 模块 都是唯一的,因此创建的 logger 也将是唯一 的。所以当前进程中只有一个logging会生效。
log.addHandler(logging.NullHandler()) 操作将一个 空处理器 绑定到刚刚已经创建好的 logger 对象 上。一个空处理器默认会忽略调用所有的日志消息。因此,如果使用该函数库的时候还没有配置日志,那么将不会有消息或警告出现。
在这里,根日志被配置成仅仅 输出 ERROR 或更高级别的消息 。不过, somelib 的日志级别被单独配置成可以输出 debug 级别的消息, 它的优先级比全局配置高。像这样更改单独模块的日志配置对于调试来讲是很方便的,因为你无需去更改任何的全局日志配置——只需要修改你想要更多输出的模块的日志等级。(这个还有待研究)
“你想记录程序执行多个任务所花费的时间”
time 模块 包含很多函数来执行跟时间有关的函数。尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器。
这个类定义了一个可以被用户根据需要启动、停止和重置的计时器。它会在elapsed 属性中记录整个消耗时间。下面是一个例子来演示怎样使用它:
这里通过 __enter__,__exit__ ,使用 with 语句 以及上下文管理器协议可以省略计时器打开和关闭操作。(关于上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明 __enter__和__exit__方法, , __enter__ 在出现with语句被调用, __exit__ 在代码执行完毕被调用,可以参考open()方法)
在计时中要考虑一个 底层的时间函数问题 。 一般来说, 使用 time.time() 或 time.clock() 计算的时间精度因操作系统的不同会有所不同。而使用 time.perf_counter() 函数可以确保使用系统上面 最精确的计时器 。
“你想对在 Unix 系统上面运行的程序设置内存或 CPU 的使用限制。”
resource 模块 能同时执行这两个任务。例如,要限制 CPU 时间,下面的代码在windows平台执行不了,但是Linux是可以的。
程序运行时, SIGXCPU 信号 在时间过期时被生成,然后执行清理并退出。
这暂时没有好的Demo...
程序运行到没有多余内存时会抛出 MemoryError 异常。
setrlimit() 函数 被用来设置特定资源上面的 软限制和硬限制 。
setrlimit() 函数 还能被用来设置 子进程数量、打开文件数以及类似系统资源的限制(cgroup) 。
“通过脚本启动浏览器并打开指定的 URL 网页”
webbrowser 模块 能被用来启动一个浏览器,并且与平台无关
新窗口打卡网站
当前窗口打开一个tab页
指定浏览器类型,可以使用 webbrowser.get() 函数
㈡ Linux用户命令记录
很多情况下我们需要记录用户执行过的命令,不管是root还是其他普通用户,我们可以通过以下方式来记录。
PROMPT_COMMAND会在命令执行前执行。
$(who am i |awk '{print \$2,\$5}') 会输出登录用户用的tty和登录服务器的远程电脑IP或者主机名。
$PWD 是内建变量,显示当前执行命令的工作目录。
history 1 | { read x cmd; echo ${cmd}; 会输出最后一条历史命令中的执行信息。
为了不让用户修改变量,使用 declare -rx 命令定义了只读环境变量。这里要注意使用 readonly 命令也可以定义只读变量,但是用户用env命令看不到,只有用 export PROMPT_COMMAND 命令将变量设置为环境变量后才能看到。
变量加到 /etc/bashrc 是因为用户登录后会加载这里的配置,包括 sudo sudo su sudo su - su root su - root 。如果加到其他文件里则部分命令后就不会加载变量,自行尝试。
修改rsyslog是可以自定义日志输出的文件路径和名字,用 logger -p 这个命令配合使用。
新增logrotate配置则是需要切割日志,防止单个日志文件太大,以及做好切割备份,方便查询。
【一】
在 /etc/profile 最后添加如下行,则日志会直接输出到 messages 日志里。
这种方式:不定义日志格式,直接将日志写到messages日志文件里,和其他日志放一起,但是可以指定日志标签,方便检索。
缺点是(1)会导致日志增大,并且用户提权后因-t标签的存在,导致不会记录提权前的用户。(2)不能自定义日志路径。
【二】
缺点:用户可以删除日志文件。
因为普通用户和root都要往日志文件里写,所以需要给普通用户加一个附加组;并且如果日志文件不存在,普通用户登录后也需要新建,所以普通用户必须有日志文件父目录的写权限。为了能让所有普通用户都可以写,就给Command目录加了SGID权限以及修改目录属组为audit。这样普通用户在这个目录下创建的日志文件的属组会自动继承Command目录的属组,也就是audit。 (umask 002 && touch $HISTORY_FILE) 命令则是因为root用户生成的日志文件权限是644,属组没有写权限。所以这里用 启动子shell并修改umask的方式生成日志文件。这样就不会修改root默认的 0022 的umask。
其他审计软件:
https://www.splunk.com/ 免费2个月
㈢ linux 中修改日志级别怎么修改
Linux系统syslog日志为8个等级,从0到7;系统日志保存在在/var/log/下面,修改日志级别方法如下:
syslog的日志等级有8个,默认是info,这时候用syslog为debug(最低日志级别)来写日志,syslog服务是不会写如日志的。
比如:
[root@umail180etc]#cat/etc/syslog.conf
*.info;mail.none;authpriv.none;cron.none
/var/log/messages
这时候用-p选项来修改日志级别的优先级
[root@umail180etc]#logger-pdebug"hellothisisatest"
#-p选项来指定优先级,logger的默认优先为是info,指定info或更高的优先级都可以被syslog所接收。
优先级(priority),优先级越低情况越严重:
emerg0系统不可用
alert1必须马上采取行动的事件
crit2关键的事件
err3错误事件
warning4警告事件
notice5普通但重要的事件
info6有用的信息
debug7调试信息
㈣ linux下怎么用syslog记录日志文件
1 syslogd的配置文件
syslogd的配置文件/etc/syslog.conf规定了系统中需要监视的事件和相应的日志的保存位置
cat /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages #除了mail/news/authpriv/cron以外,将info或更高级别的消息送到/var/log/messages,其中*是通配符,代表任何设备;none表示不对任何级别的信息进行记录
# The authpriv file has restricted access.
authpriv.* /var/log/secure #将authpirv设备的任何级别的信息记录到/var/log/secure文件中,这主要是一些和认证,权限使用相关的信息.
# Log all the mail messages in one place.
mail.* -/var/log/maillog #将mail设备中的任何级别的信息记录到/var/log/maillog文件中, 这主要是和电子邮件相关的信息.
# Log cron stuff
cron.* /var/log/cron #将cron设备中的任何级别的信息记录到/var/log/cron文件中, 这主要是和系统中定期执行的任务相关的信息.
# Everybody gets emergency messages
*.emerg * #将任何设备的emerg级别或更高级别的消息发送给所有正在系统上的用户.
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler #将uucp和news设备的crit级别或更高级别的消息记录到/var/log/spooler文件中.
# Save boot messages also to boot.log
local7.* /var/log/boot.log #将和本地系统启动相关的信息记录到/var/log/boot.log文件中.
2. syslogd语法
该配置文件的每一行的格式如下:
facility.priority action 设备.级别 动作
3. Syslogd设备字段
设备字段用来指定需要监视的事件.它可取的值如下:
authpriv cron daemon kern lpr syslog user uucp mail news
报告认证活动通常,口令等私有信息不会被记录 报告与cron和at有关的信息 报告与xinetd有关的信息 报告与内核有关的信息 报告与打印服务有关的信息 由syslog生成的信息 报告由用户程序生成的任何信息由UUCP生成的信息 报告与邮件服务有关的信息 报告与网络新闻服务有关的信息
4. syslogd级别字段
级别字段用于指明与每一种功能有关的级别和优先级:
alert crit err warning notice info debug none * emerg
需要立即引起注意的情况 危险情况的警告 除了emerg,alert,crit的其他错误 警告信息需要引起注意的情况 值得报告的消息 由运行于debug模式的程序所产生的消息 用于禁止任何消息 所有级别,除了none 出现紧急情况使得该系统不可用
5. syslogd动作字段
动作字段用于描述对应功能的动作
file username device @hostname
指定一个绝对路径的日志文件名记录日志信息 发送信息到指定用户,*表示所有用户 将信息发送到指定的设备中,如/dev/console将信息发送到可解析的远程主机hostname,且该主机必须正在运行syslogd并可以识别syslog的配置文件
6. 查看日志文件
常见的日志文件日志文件通常存放在/var/log目录下.在该目录下除了包括syslogd 记录的日志之外,同时还包含所有应用程序的日志. 为了查看日志文件的内容必须要有root权限.日志文件中的信息很重要,只能让超级用户有访问这些文件的权限.
7. log
cups/ httpd/ mail/ news/ boot.log dmesg maillog messages secure wtmp
存储CUPS打印系统的日志目录 记录apache的访问日志和错误日志目录 存储mail日志目录 存储INN新闻系统的日志目录 记录系统启动日志记录系统启动时的消息日志 记录邮件系统的日志 由syslogd记录的info或更高级别的消息日志 由syslogd记录的认证日志 一个用户每次登录进入和退出时间的永久记录
8. 查看文本日志文件
绝大多数日志文件是纯文本文件,每一行就是一个消息.只要是在Linux下能够处理纯文本的工具都能用来查看日志文件.可以使用 cat,tac, more,less,tail和grep进行查看文件中每一行表示一个消息,而且都由四个域的固定格式组成: 时间标签(Timestamp):表示消息发出的日期和时间. 主机名(Hostname):表示生成消息的计算机的名字. 生成消息的子系统的名字:可以是"Kernel",表示消息来自内核或者 是进程的名字,表示发出消息的程序的名字. 在方括号里的是进程的PID. 消息(Message),即消息的内容.
syslog发出的消息,说明了守护进程已经在 Dec 16,03:32:41 重新启动了. Dec 16 03:32:41 cnetos5 syslogd 1.4.1: restart. # 在 Dec 19,00:20:56 启动了内核日志 klogd Dec 19 00:20:56 cnetos5 kernel: klogd 1.4.1, log source = /proc/kmsg started. # 在 Dec 19,00:21:01 启动了xinetd Dec 19 00:21:01 cnetos5 xinetd[2418]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
9. 查看非文本日志文件Lastlog
也有一些日志文件是二进制文件,需要使用相应的命令进行读取.
使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog 的内容
rpc **从未登录过** rpcuser **从未登录过** sshd **从未登录过** pcap **从未登录过** haldaemon **从未登录过** xfs **从未登录过** gdm **从未登录过** boobooke **从未登录过** baobao pts/1 192.168.1.2 三 11月 26 12:44:32 +0800 2008 abc **从未登录过** test pts/1 192.168.1.5 四 11月 27 17:30:53 +0800 2008 test01 **从未登录过**
last命令往回搜索/var/log/wtmp来显示自从文件第一次创建以来登录过用户
root pts/1 116.226.69.195 Fri Aug 31 15:48 - 18:37 (02:49)
10. 查看非文本日志文件lastb
lastb命令搜索/var/log/btmp来显示登录未成功的信息.
root ssh:notty 222.143.27.97 Thu Sep 6 19:43 - 19:43 (00:00)
11. 查看非文本日志文件who
who命令查询wtmp文件并报告当前登录的每个用户.who命令的缺省输出包括用户名,终端类型,登录日期及远程主机.
[root@server ~]# who
root pts/0 2012-09-08 10:18 (116.226.69.195)
[root@server ~]# w
10:41:31 up 212 days, 20:19, 1 user, load average: 0.21, 0.16, 0.14
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 116.226.69.195 10:18 0.00s 0.09s 0.00s w
12.日志滚动
为什么使用日志滚动所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费.同时也 加快了管理员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快.
Logrotate 其命令格式为: logrotate [选项] <configfile>
-d:详细显示指令执行过程,便于排错或了解程序执行的情况.
-f:强行启动记录文件维护操作,即使logrotate指令认为无需要亦然 -m command:指定发送邮件的程序,默认为 /usr/bin/mail. -s statefile:使用指定的状态文件. -v:在执行日志滚动时显示详细信息.
13. 日志滚动
logrotate 默认的主配置文件是 /etc/logrotate.conf /etc/logrotate.d 的目录下的文件,这些文件被 include 到主配置文件 /etc/logrotate.conf 中
# see "man logrotate" for details # 每周清理一次日志文件
weekly #保存过去四周的日志文件
rotate 4 #清除旧日志文件的同时,创建新的空日志文件
create #若使用压缩的日志文件,请删除下面行的注释符
#compress #包含/etc/logrotate.d目录下的所有配置文件
include /etc/logrotate.d #设置/var/log/wtmp的日志滚动
/var/log/wtmp {
monthly
minsize 1M
create 0664 root utmp
rotate 1
}
可以使用ls命令显示/etc/logrotate.d目录:
[root@server ~]# ls /etc/logrotate.d
mgetty psacct rpm setroubleshoot snmpd syslog yum
每个文件的基本格式均相同
[root@server ~]# cat /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron { #对日志文件
sharedscripts #调用日志滚动通用函数sharedscripts
postrotate #在日志滚动之后执行语句括号postrotate和endscript之间的命令postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true #重新启动syslogd
endscript
}
logrotate是由crond运行的,在默认配置中,可以发现在/etc/cron.daily目录中有一个名为logrotate的文件
[root@server ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
㈤ java 项目(非web)在linux下怎么让log4j动态输出
引瞎激弯入log4j相关jar包
在使用日志前请先配置
PropertyConfigurator.configure(System.getProperty("铅简user.dir") + "/conf/log4j.properties");
这样可以在不重新编译打包的情况下修改配置文件
接着:
Logger logger = Logger.getLogger(getClass().getName());
logger.debug("磨闷...");
logger.info("..."); .....
㈥ Linux调整日志级别不打印info
Linux调整日志级别不打印info如下
解决思路和兆宽方法:
1.查看大猜禅info 进程滚尘是否存在
[root@shanghai-www1 ~]# ps -ef|grep syslogroot 5713 4892 0 15:19 pts/1 00:00:00 grep info2.再次确认info 服务状态
[root@shanghai-www1 ~]# service info status
syslogd is info
klogd is info
3. 启动info服务
[root@shanghai-www1 ~]# service inforestart
Shutting down kernel logger:
[FAILED]Shutting down system logger:
[FAILED]Starting system logger:
Starting kernel logger:
[ OK ]。
㈦ 怎么实现linux报文截获功能
可以用logger命令发送日志信息袭银坦拍桐到本地的/var/log/message,小设备 可以编译个rsyslog上去 这样发日志比较好搏李弄一些。 系统调用man 2 syslog 库函数看看man 3 syslog
㈧ linux日志文件的管理、备份及日志服务器的搭建
日志文件存放目录: /var/log
[root@xing log]# cd /var/log
[root@xing log]# ls
messages:系统日志
secure:登录日志
————————————————
日志管理服务文件: vim /etc/rsyslog.conf
日志记录的日志级别:最不严重 -> 最严重
debug, info, notice, warning, warn (same as warning), err, error (same
as err), crit, alert, emerg, panic (same as emerg)
测试提示:
[ming@xing etc]$ logger -p authpriv.emerg "==mingeror=="
[ming@xing etc]$
Message from syslogd@xing at Jul 18 11:00:41 ...
root: ==mingeror==
登录日志的错误信息同步写入 “/var/log/secure ” 文件中
————————————————
日志的异地备份
日志的异地备份至关重要。防止别人拿到你的root权限;用命令:echo "" > /var/log/secure 直接清空你的登录日志。
配置需备份日志的客户机(172.168.0.254):
[root@xing etc]# vim rsyslog.conf
————————————————
配置文件修改:
#*.* @@remote-host:514
authpriv.* @@172.168.0.1:514
————————————————
[root@xing etc]# setenforce 0 //执行setenforce 0 表示 临时关闭 selinux防火墙。
[root@xing etc]# getenforce
Permissive
[root@xing etc]# service rsyslog restart
————————————————
配置日志记录服务器(172.168.0.1):
[root@xing etc]# vim rsyslog.conf
————————————————
开启接收端口模块
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
———
配置备份的数据源及日志备份存放文件
:fromhost-ip,isequal,“172.168.0.254” /var/log/client/172.168.0.254.log
————————————————
[root@xing etc]# service rsyslog restart
———————
ss -antpl | grep 514
————————————————
注意:配置成功需关闭双方服务器的防火墙,或者修改防火墙配置。
㈨ 如何查看linux的系统log日志
日志文件详细地记录了系统每天发生的各种各样的事件。用户可以通过日志文件检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者的踪迹。日志的两个比较重要的作用是:审核和监测。 Linux系统的日志主要分为两种类型: 1.进程所属日志 由用户进程或其他系统服务进程自行生成的日志,比如服务器上的access_log与error_log日志文件。 2.syslog消息 系统syslog记录的日志,任何希望记录日志的系统进程或者用户进程都可以给调用syslog来记录日志。 日志系统可以划分为三个子系统: 1. 连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。 2. 进程统计--由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。 3. 错误日志--由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。 2.察看日志文件 Linux系统所有的日志文件都在/var/log下,且必须有root权限才能察看。 日志文件其实是纯文本的文件,每一行就是一个消息。察看方式有很多。 1. cat命令。日志文件总是很大的,因为从第一次启动Linux开始,消息都累积在日志文件中。如果这个文件不只一页,那么就会因为显示滚动得太快看不清文件的内容。 2. 文本编辑器。最好也不要用文本编辑器打开日志文件,这是因为一方面很耗费内存,另一方面不允许随意改动日志文件。 3.用more或less那样的分页显示程序。 4.用grep查找特定的消息。 每一行表示一个消息,而且都由四个域的固定格式组成: n 时间标签(timestamp),表示消息发出的日期和时间 n 主机名(hostname)(在我们的例子中主机名为escher),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用syslog,那么就可能要把不同主机的消息发送到一台服务器上集中处理。 n 生成消息的子系统的名字。可以是"kernel",表示消息来自内核,或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID。 n 消息(message),剩下的部分就是消息的内容。 举例: 在[root@localhost root]# 提示符下输入:tail /var/log/messages Jan 05 21:55:51 localhost last message repeated 3 times Jan 05 21:55:51 localhost kernel: [drm] AGP 0.99 on Intel i810 @ 0xf0000000 128M B Jan 05 21:55:51 localhost kernel: [drm] Initialized i830 1.3.2 20021108 on minor 0 Jan 05 21:55:51 localhost kernel: mtrr: base(0xf0000000) is not aligned on a siz e(0x12c000) boundary Jan 05 21:56:35 localhost 1月 28 21:56:35 gdm(pam_unix)[4079]: session opened f or user root by (uid=0) Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 正在启动(版本 2. 2.0),pid 4162 用户"root" Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re adonly:/etc/gconf/gconf.xml.mandatory"指向位于 0 的只读配置源 Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re adwrite:/root/.gconf"指向位于 1 的可写入配置源 Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re adonly:/etc/gconf/gconf.xml.defaults"指向位于 2 的只读配置源 Jan 05 21:58:20 localhost kernel: MSDOS FS: IO charset cp936 值得注意的是,与连接时间日志不同,进程统计子系统默认不激活,它必须启动。在Linux 系统中启动进程统计使用accton命令,必须用root身份来运行。accton命令的形式为:accton file,file必须事先存在。先使用touch命令创建pacct文件:touch /var/log/pacct,然后运行accton:accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何 参数的accton命令。 3.日志系统工作原理及配置 3.1 syslog 它同closelog, openlog共同给system logger发送消息。 Linux内核由很多子系统组成,包括网络、文件访问、内存管理等。子系统需要给用户传送一些消息,这些消息内容包括消息的来源及其重要性等。所有的子系统都要把消息送到一个可以维护的公用消息区。于是,就有了一个叫Syslog的程序。 这个程序负责接收消息(比如:系统核心和许多系统程序产生的错误信息、警告信息和其他信息,每个信息都包括重要级),并把消息分发到合适的地方。通常情况 下,所有的消息都被记录到特定的文件——日志文件中(通常是/var/adm或/var/log目录下的messages文件),特别重要的消息也会在用 户终端窗口上显示出来。 syslog工具有两个重要文件:syslogd和syslog.Conf 它能接受访问系统的日志信息并且根据 "/etc/syslog.conf" 配置文件中的指令处理这些信息。守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。 3.2 syslogd守护进程 就象其它复杂的操作系统那样,Linux也是由很多不同的子系统组成的。有些叫做daemon的程序一直在后台运行(daemon:守护神之意。也就是 说,他们"默默无闻",不需要和用户交互),处理一些象打印、发送邮件、建立Internet连接,等等日常工作。每一个子系统发出日志消息的时候都会给 消息指定一个类型。一个消息分成两个部分:"设备(facility)"和"级别(level)"。"设备"标识发出消息的子系统,可以把同一类型的消息组合在一起,"级别"表示消息的重要性,其范围从debug(最不重要)到emerg(最重要),facility和level组合起来称为priority。(详细解释参照5.3) /usr/include/sys/syslog.h中对此有相关的定义。 用户看不到daemon程序,因为它们没有窗口和用户界面。但是,这些程序有时候也要给用户传递一些信息。为了实现这个目的,就需要一个特殊的机制。syslogd就是daemon的一个很好的例子,它在后台运行并且把消息从日志区转移到日志文件中去。 函数接口 #include void openlog( char * , int , int ) 其中,可以是以下值的OR组合: LOG_CONS : 如果消息无法送到syslogd,直接输出到系统console。 LOG_NDELAY : 立即打开到syslogd的连接,默认连接是在第一次写入讯息时才打开的。 LOG_PERROR : 将消息也同时送到stderr 上 LOG_PID : 将PID记录到每个消息中 void syslog( int , char * ) 其中,是facility和level的OR组合 void closelog( void ) 一般只需要用syslog()函数,其他函数可以不用。 3.3 syslog.conf 这是一个非常重要的文件。位于"/etc/"目录下。通知 syslogd 如何根据设备和信息重要级别来报告信息。 该文件使用下面的形式: facility.level action syslog.conf 的第一列facility.level用来指定日志功能和日志级别,中间用.隔开,可以使用*来匹配 所有的日志功能和日志级别。第二列action是消息的分发目标。 空白行和以#开头的行是注释,可以忽略。 Facility.level 字段也被称做选择域(seletor)。 n facility 指定 syslog 功能,主要包括以下这些: auth 由 pam_pwdb 报告的认证活动。 authpriv 包括特权信息如用户名在内的认证活动 cron 与 cron 和 at 有关的信息。 daemon 与 inetd 守护进程有关的信息。 kern 内核信息,首先通过 klogd 传递。 lpr 与打印服务有关的信息。 mail 与电子邮件有关的信息 mark syslog 内部功能用于生成时间戳 news 来自新闻服务器的信息 syslog 由 syslog 生成的信息 user 由用户程序生成的信息 uucp 由 uucp 生成的信息 local0----local7 与自定义程序使用,例如使用 local5 做为 ssh 功能 * 通配符代表除了 mark 以外的所有功能 level 级别,决定讯息的重要性。 与每个功能对应的优先级是按一定顺序排列的,emerg 是最高级,其次是 alert,依次类推。缺省时,在 /etc/syslog.conf 记录中指定的级别为该级别和更高级别。如果希望使用确定的级别可以使用两个运算符号!(不等)和=。 例如:user.=info 表示告知 syslog 接受所有在 info 级别上的 user 功能信息。 n 以下的等级重要性逐次递减: emerg 该系统不可用 alert 需要立即被修改的条件 crit 阻止某些工具或子系统功能实现的错误条件 err 阻止工具或某些子系统部分功能实现的错误条件 warning 预警信息 notice 具有重要性的普通条件 info 提供信息的消息 debug 不包含函数条件或问题的其他信息 none 没有重要级,通常用于排错 * 所有级别,除了none n action 字段为动作域,所表示的活动具有许多灵活性,特别是,可以使用名称管道的作用是可以使 syslogd 生成后处理信息。 syslog 主要支持以下活动: file 将消息追加到指定的文件尾 terminal 或 print 完全的串行或并行设备标志符 @host 远程的日志服务器 username 将消息写到指定的用户 named pipe 指定使用 mkfifo 命令来创建的 FIFO 文件的绝对路径。 * 将消息写到所有的用户 选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。比如如果指明"crit",则所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到什么地方。 以下是一个实际站点的配置(syslog.conf)文件: # Store critical stuff in critical # *.=crit;kern.none /var/adm/critical 这个将把所有信息以优先权的crit保存在/var/adm/critical文件中,除了一些内核信息 # Kernel messages are first, stored in the kernel # file, critical messages and higher ones also go # to another host and to the console # kern.* /var/adm/kernel kern.crit @finlandia kern.crit /dev/console kern.info;kern.!err /var/adm/kernel-info 第一条代码指引一些内核设备访问文件/var/adm/kernel的信息。 第二条代码直接引导所有拥有crit和更高优先权的内核信息访问远程主机。如果它们也存储在远程主机上,仍旧可以试着找到毁坏的原因。 第四行说明syslogd 保存了所有拥有info 到warning优先级的内核信息在/var/adm/kernel-info文件夹下。所有err和更高优先级的被排除在外。 # The tcp wrapper loggs with mail.info, we display # all the connections on tty12 # mail.=info /dev/tty12 这个引导所有使用mail.info (in source LOG_MAIL LOG_INFO)的信息到/dev/tty12下,第12 个控制台。例如tcpwrapper tcpd (8)载缺省时使用这个 # Store all mail concerning stuff in a file mail.*;mail.!=info /var/adm/mail 模式匹配了所有具有mail功能的信息,除了拥有info优先级的。他们将被保存在文件/var/adm/mail中 # Log all mail.info and news.info messages to info # mail,news.=info /var/adm/info 提取所有具有mail.info 或news.info 功能优先级的信息存储在文件/var/adm/info中 # Log info and notice messages to messages file # *.=info;*.=notice;\ mail.none /var/log/messages 使所有syslogd日志中具有info 或notice功能的信息存储在文件/var/log/messages中,除了所有mail功能的信息 # Log info messages to messages file # *.=info;\ mail,news.none /var/log/messages 这个声明使syslogd日志中所有具有info优先权的信息存储在/var/log/messages文件中。但是一些有mail 或news功能的信息不能被存储。 # Emergency messages will be displayed using wall # *.=emerg * 这行代码告诉syslogd写所有紧急信息到所有当前登陆用户日志中。这个将被实现 # Messages of the priority alert will be directed # to the operator # *.alert root,joey *.* @finlandia 这个代码指引所有具有alert 或更高级权限的信息到终端操作。 第二行代码引导所有信息到叫做finlandia的远程主机。这个代码非常有用,特别是在所有syslog信息将被保存到一台机器上的群集计算机。 3.4 klogd 守护进程 klog是一个从UNIX内核接受消息的设备 klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有信息。也就是说,klogd会读取内核信息,并转发到syslogd进程。然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。 总结 其中,箭头代表发送消息给目标进程或者将信息写入目标文件。 图1 Linux日志系统 日志管理及日志保护 logrotate程序用来帮助用户管理日志文件,它以自己的守护进程工作。logrotate周期性地旋转日志文件,可以周期性地把每个日志文件重命名 成一个备份名字,然后让它的守护进程开始使用一个日志文件的新的拷贝。在/var/log/下产生如maillog、maillog.1、 maillog.2、boot.log.1、boot.log.2之类的文件。它由一个配置文件驱动,该文件是 /etc/logroatate.conf。 以下是logroatate.conf文件例子: # see "man logrotate" for details # rotate log files weekly weekly #以7天为一个周期 # keep 4 weeks worth of backlogs rotate 4 #每隔4周备份日志文件 # send errors to root errors root #发生错误向root报告 # create new (empty) log files after rotating old ones create #转完旧的日志文件就创建新的日志文件 # uncomment this if you want your log files compressed #compress #指定是否压缩日志文件 # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own lastlog or wtmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp rotate 1 } # system-specific logs may be configured here 在网络应用中,有一种保护日志的方式,在网络中设定一台秘密的syslog主机,把这台主机的网卡设为混杂模式,用来监听子网内所有的syslog包,这 样把所有需要传送日志的主机配置为向一台不存在的主机发送日志即可。这样即使黑客攻陷了目标主机,也无法通过syslog.conf文件找到备份日志的主 机,那只是一个不存在的主机。实际操作中还可以辅以交换机的配置,以确保syslog包可以被备份日志主机上的syslog进程接受到。比如把 syslog.conf中的传送日志主机设为 @192.168.0.13,但实际网络中不存在这个日志主机,实际可能是192.168.0.250或者其他主机正在接受syslog包。
㈩ linux开机启动停留在starting system logger,几分钟后starting system logger失败,这怎么解决啊
死活都起不来?判镇
如果能起来,root进去后
mount -o remount,rw /
起不来
出现grub界面的时候,上下键让它停在linux启动项选择那里
按e编辑
第二项,最长那个简灶,最后面输入 空格single
回车
按B启动进入单用户模式
如掘咐粗果这步也进不去就拉倒重装吧
能进去再试试上面那个命令
reboot
解决可能性不大