之前有个系统,日志是用log4j,几十M分一个文件,日志越堆越多,同时,需要对登陆日志进行统计,纯粹1,2,3结尾,信息量太小,加个时间戳 会好些。 于是,决定实现一个日志搬运的小工具 。
思路
流程很简单, for一下源日志目录,把合规则的log给拿出来move 到目标log目录中,,然后用一个while 1==1 来长期运行,设置成几秒一次,
使用
配置下目标路径,
# 前缀
beginstr = 'business.tmp'
#排除的后缀
excludePostfix1 = 'log'
excludePostfix2 = 'tmp'
#目标log路径,move过去
destlogpath = '/home/abc/bak/logs/dest' # 这个为目标路径
直接放到日志 目录 里 运行。python movelog.py
之后你往这个文件夹下面copy如business.tmp.1这样的文件,就会自动被搬到目标目录,现在是定时5秒
实现代码
#!/usr/bin/python
#coding:UTF-8
import paramiko,datetime,os,logging
import os,shutil
import sys
import time
# 前缀
beginstr = 'business.tmp'
#排除的后缀
excludePostfix1 = 'log'
excludePostfix2 = 'tmp'
#目标log路径,move过去
# destlogpath = 'E:/codeplace/python/self/movelog/destfold'
destlogpath = '/home/huge/bak/logs/dest' # 这个为目标路径
srclogpath = os.getcwd() # 日志来源目录,用当前目录
def toMove(srcpath,destpath):
now = datetime.datetime.now()
nowstr = now.strftime('%Y%m%d%H%M%S%S')
files = os.listdir(srcpath)
for fname in files:
# 判断文件名后缀是否为log,为log/tmp则略去
if fname.split('.')[-1] == excludePostfix1:
continue
if fname.split('.')[-1] == excludePostfix2:
continue
# 判断后缀要为数字
if not fname.split('.')[-1].isdigit():
continue
# 判断文件前缀
if not fname.startswith(beginstr):
continue
# 文件被其它进程处理时
tmpfilepath = srcpath + os.sep + fname
try:
shutil.move(tmpfilepath,destpath+ os.sep+fname+'_'+nowstr)
except Exception,e:
print fname+'文件不可移动'
if __name__ == "__main__":
while 1==1:
# 执行搬运
toMove(srclogpath,destlogpath)
time.sleep(5) # 定时5s
代码是很好理解的,自己看就OK了,
说明:
log4j2 是有 filePattern的配置来 规则备份到dist目录下的,但log4j貌似没有,所以上面的功能是用于log4j文件的搬运动作.
后续可以扩展下,如目标 地址可以设置成远端,文件的过滤可以多元化