最近公司发现,日志产生的太多了,于是让我写个方法来解决,一开始是让我删除,后来想了想让我先压缩再删除文件夹,下面提供两个版本的源代码及简单使用。

注:这两个代码也是博主CV的网上然后修改的,如侵权,请联系本人。(就算你联系了我也不会删,给你加个原文链接,啊嘻嘻嘻)

方法一:

在log4的config的配置文件中加上如下配置:

<logger name="ApplicationRollingFile">
<level value="ALL"/>
<appender-ref ref="InfoLog"/>
<appender-ref ref="WarnLog"/>
<appender-ref ref="TraceLog"/>
<appender-ref ref="ErrorLog"/>
<appender-ref ref="FatalLog"/>
</logger>

日志划分删除代码:

这里我加了个额外情况,就是生产环境中日志可能从别的地方烤过来,,,确实有这种情况。这个是自己设定多少天,然后传参传进函数,调用时会删除从今天开始算起,前面days的所有日志.但是删了万一日后要用,所以建议使用第二种方法,即先压缩,再删除原文件夹。

public class LogDivide
{
static ILog _log = null;
static object lockHelper = new object();
public static void GetLog(int days)
{ if (null == _log)
{
lock (lockHelper)
{
if (null == _log)
{
StackTrace stackTrace = new StackTrace(0);
StackFrame stackFrame = stackTrace.GetFrame(0);
MethodBase methodBase = stackFrame.GetMethod(); // ApplicationRollingFile在.config文件中配置的名称
_log = LogManager.GetLogger("ApplicationRollingFile");
Task.Run(() => {
var apps = _log.Logger.Repository.GetAppenders();
if (apps.Length <= 0)
{
return;
}
var now = DateTime.UtcNow.AddDays(-1*days);
foreach (var item in apps)
{
if (item is RollingFileAppender)
{
RollingFileAppender roll = item as RollingFileAppender;
var dir = Path.GetDirectoryName(roll.File);
var files = Directory.GetFiles(dir, "*.txt");
//var sample = "log.txt2017-10-23.txt"; foreach (var filePath in files)
{
var file = new FileInfo(filePath); // 20220809 jyj 为了防止更换电脑日志从其他地方拷过来,这里采用修改时间
if (file.LastWriteTimeUtc < now)
{
try
{
file.Delete();
}
catch (Exception)
{ }
}
}
}
}
});
}
}
} //return _log;
}
}

方法二:

方法二呢

方法二呢就是上面说的先压缩,然后再删除原文件夹,这样做呢保守一点,推荐使用。

    public class LogZip
{
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="sourceFilePath"></param>
/// <param name="destinationZipFilePath"></param>
public static void CreateZip(string sourceFilePath, string destinationZipFilePath)
{
if (sourceFilePath[sourceFilePath.Length - 1] != Path.DirectorySeparatorChar)
{
sourceFilePath += Path.DirectorySeparatorChar;
} ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath));
zipStream.SetLevel(6); // 压缩级别 0-9
CreateZipFiles(sourceFilePath, zipStream, sourceFilePath); zipStream.Finish();
zipStream.Close();
} /// <summary>
/// 递归压缩文件
/// </summary>
/// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>
/// <param name="zipStream">打包结果的zip文件路径(类似 D:\WorkSpace\a.zip),全路径包括文件名和.zip扩展名</param>
/// <param name="staticFile"></param>
private static void CreateZipFiles(string sourceFilePath, ZipOutputStream zipStream, string staticFile)
{
try
{
if (System.IO.File.Exists(sourceFilePath))
{
Crc32 crc = new Crc32();
string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath);
foreach (string file in filesArray)
{
if (Directory.Exists(file)) //如果当前是文件夹,递归
{
CreateZipFiles(file, zipStream, staticFile);
}
else //如果是文件,开始压缩
{
FileStream fileStream = File.OpenRead(file); byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer, 0, buffer.Length);
string tempFile = file.Substring(staticFile.LastIndexOf("\\") + 1);
ZipEntry entry = new ZipEntry(tempFile); entry.DateTime = DateTime.Now;
entry.Size = fileStream.Length;
fileStream.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
zipStream.PutNextEntry(entry); zipStream.Write(buffer, 0, buffer.Length);
}
}
}
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
}
} public static void DeleteFolder(string path)
{
try
{
if (System.IO.File.Exists(path))
{
// 去除文件夹和子文件的只读属性
System.IO.DirectoryInfo fileInfo = new DirectoryInfo(path);
fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory;
File.SetAttributes(path, FileAttributes.Normal); // 判断文件夹是否还存在
if (Directory.Exists(path))
{
foreach (string f in Directory.GetFileSystemEntries(path))
{
if (File.Exists(f))
{
File.Delete(f);
}
else
{
DeleteFolder(f);
}
}
} // 删除空文件夹
Directory.Delete(path);
} }
catch (Exception ex)
{
LogHelper.Error("日志压缩出现异常" + ex.ToString());
throw ex;
}
} }

  

Log4NET 日志分割删除与压缩解决思路(附源码)的更多相关文章

  1. log4net日志分割,按大小分割

    最近写了一个socket通信的手表在线服务端,在日志方面,记录下Log4net日志分割 1.引入log4net.dll 2.web.config添加configsection handler 映射: ...

  2. arcgis api 3.x for js 解决 textSymbol 文本换行显示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  3. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  4. (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路

    [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html).   [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...

  5. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  6. 通用查询实现方案(可用于DDD)[附源码] -- 设计思路

    原文:通用查询实现方案(可用于DDD)[附源码] -- 设计思路 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html).   ...

  7. leaflet结合geoserver利用WFS服务实现图层删除功能(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  8. cesium结合geoserver利用WFS服务实现图层删除(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  9. .Net高并发解决思路(附源码)

    本文如有不对之处,欢迎各位拍砖扶正.另源码在文章最下面,大家下载过后先还原一下nuget包,需要改一下redis的配置,rabbitmq的配置以及Ef的连接字符串.另外使用的是CodeFirst,先u ...

  10. zookeeper 删除snapshot和transaction log的源码解读

    转载请注明源地址http://www.cnblogs.com/dongxiao-yang/p/4910059.html zookeeper具有自动清除快照日志和事务日志的工能,可以在配置文件设置aut ...

随机推荐

  1. 升级grafana

    We recommend everyone to upgrade Grafana often to stay up to date with the latest fixes and enhancem ...

  2. SingleFlight

    Go 语言扩展包中提供了另一种同步原语,它能够在一个服务中抑制对下游的多次重复请求.一个比较常见的使用场景是:我们在使用 Redis 对数据库中的数据进行缓存,发生缓存击穿时,大量的流量都会打到数据库 ...

  3. 配置VS Code链接外部gsl库文件

    配置VS code在C语言中调用gsl库文件 gsl安装 sudo apt-get install libgsl0-dev 先确认gsl库,gcc都已正确安装,命令行 gcc -L/usr/local ...

  4. MOBI 】逆流而上的我:重塑心理韧性,在逆境中实现自我超越【早稻田大学名誉教授、哈佛大学客座研究

    书本详情 标题:逆流而上的我:重塑心理韧性,在逆境中实现自我超越[早稻田大学名誉教授.哈佛大学客座研究员加藤谛三的年度心理学温情巨作!掌握心理韧性,每个人都是生活的修行者!] | 加藤谛三 |年份:2 ...

  5. Micro-OA系统

    Micro-OA简单描述 MicroOA是一款不需要专业的开发知识或开发经验,通过页面交互式即可实现动态搭建表单的微型办公自动化系统.在日常工作当中,我们面临着各种各样的表单,在开发系统时,若我们采用 ...

  6. 用tkinter编写一个获取图片资源的GUI工具

    目录 效果展示 导入tkinter库 窗口属性 按钮和输入框 文本输入框Text 运行 打包成exe文件 源码地址 本文可以学习到以下内容: 使用tkinter的Entry功能获取本地文件夹 使用tk ...

  7. (1028) 权限,chmod、chgrp、chown详解

    https://www.cnblogs.com/Berryxiong/p/6193866.html 例1: $ chgrp - R book /opt/local /book 改变/opt/local ...

  8. C盘爆红满了怎么办?既然C盘装不下了,那咱给C盘扩容不就完事了吗!

    我们在使用电脑的过程中,经常容易出现C盘爆红,反而其他盘还有大量可用空间的情况. 为什么会这样呢?其实主要就两种原因: 一是电脑使用习惯不好,不管什么软件都默认安装在C盘,大文件又喜欢放在桌面,久而久 ...

  9. 1067- invalid default value for ""

    创建表时报的,一个时间字段类型是datetime,一保存就报错,网上说是datetime类型只支持mysql 5.6.5+,我看了下我的版本,5.8的,没什么问题,然后找了许久找到了错误的地方. 很蠢 ...

  10. mysql压缩表小记

    参考文档: https://www.163.com/dy/article/GI4CH5N305319P76.html https://learn.lianglianglee.com/专栏/MySQL实 ...