C# 实现一个Log日志文件 以每2Mb创建一个新的日志

本文详细介绍了如何在程序中实现日志文件的管理与操作,包括日志路径设置、文件创建、日志大小限制及日志内容的写入等关键步骤。

 

这个日志文件存放在程序的bin文件夹下得Debug中

static private string logpathlog = AppDomain.CurrentDomain.BaseDirectory + "log.txt";

        static public void writelog(string classname)
        {
            string path = logpathlog;
            if (!File.Exists(path))
            {
                // Create a file to write to.
                using (File.Create(path)) { }
            }

            FileInfo fileinfo = new FileInfo(path);
            if (fileinfo.Length > 1024 * 1024 * 2)
            {
                File.Move(path, AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("yyyyMMddHHmmss") + "log.txt");

                if (!File.Exists(path))
                {
                    using (File.Create(path)) { }
                }

            }

            using (StreamWriter sw = File.AppendText(path))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + "\t\n");
                sw.WriteLine(classname + "\t\n");
                sw.WriteLine("------------------------------------------------------------------------" + "\t\n");
                sw.Close();
            }

        }


 

<think>我们被要求配置多个文件附加器(appender)以实现日志存储到多个日志文件。根据引用[2],log4net的配置通常在app.config或web.config中完成,也可以使用单独的配置文件。我们将展示如何配置多个RollingFileAppender,每个附加器写入不同的日志文件。 关键点: 1. 定义多个<appender>元素,每个appender指定不同的文件路径和名称。 2. 可以为不同的日志记录器(logger)分配不同的appender,或者通过日志级别、名称等条件进行过滤。 3. 也可以将同一个日志事件同时输出到多个appender(通过多个<appender-ref>引用)。 示例场景: 假设我们需要将日志同时记录到两个不同的文件中: - 一个文件记录所有日志(例如:all-logs.txt) - 另一个文件只记录错误日志(例如:error-logs.txt) 配置步骤: 1. 在配置文件中定义两个不同的RollingFileAppender。 2. 为错误日志文件配置一个过滤器,只允许ERROR级别及以上的日志通过。 3. 在根记录器(root)中引用所有需要的appender,或者为特定的记录器指定不同的appender。 配置示例(App.config): ```xml <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <!-- 第一个appender:记录所有日志 --> <appender name="AllLogsAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/all-logs.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="10MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <!-- 第二个appender:只记录错误日志(ERROR和FATAL) --> <appender name="ErrorLogsAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/error-logs.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="10MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> <!-- 添加过滤器,只允许ERROR和FATAL级别的日志通过 --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR" /> <levelMax value="FATAL" /> </filter> </appender> <!-- 根记录器:引用两个appender --> <root> <level value="ALL" /> <appender-ref ref="AllLogsAppender" /> <appender-ref ref="ErrorLogsAppender" /> </root> </log4net> </configuration> ``` 另一种方式:通过不同的记录器(logger)来分离日志 如果我们希望不同命名空间的日志记录到不同的文件,可以创建多个logger,每个logger引用不同的appender。 例如,将名为“MyApp.DAL”的记录器的日志记录到“dal-logs.txt”,而将“MyApp.BLL”的记录器的日志记录到“bll-logs.txt”: ```xml <log4net> <!-- Appender for DAL --> <appender name="DalAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/dal-logs.txt" /> ... <!-- 其他配置同上 --> </appender> <!-- Appender for BLL --> <appender name="BllAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/bll-logs.txt" /> ... <!-- 其他配置同上 --> </appender> <!-- 根记录器(默认) --> <root> <level value="ALL" /> <appender-ref ref="AllLogsAppender" /> </root> <!-- 为DAL命名空间配置单独的appender --> <logger name="MyApp.DAL"> <level value="ALL" /> <appender-ref ref="DalAppender" /> </logger> <!-- 为BLL命名空间配置单独的appender --> <logger name="MyApp.BLL"> <level value="ALL" /> <appender-ref ref="BllAppender" /> </logger> </log4net> ``` 代码初始化与之前相同(在程序启动时加载配置): ```csharp using log4net; using log4net.Config; public class Program { private static readonly ILog log = LogManager.GetLogger(typeof(Program)); static void Main() { // 加载配置文件(App.config) XmlConfigurator.Configure(new System.IO.FileInfo("App.config")); // 或者使用:XmlConfigurator.Configure(); // 记录日志 log.Info("This will be written to all-logs.txt and if it's an error also to error-logs.txt"); log.Error("This is an error and will be written to both files"); } } ``` 注意: 1. 在记录日志时,如果日志事件同时匹配多个appender,它会被写入多个文件(例如,在第一个配置中,一个ERROR日志会同时写入all-logs.txt和error-logs.txt)。 2. 使用过滤器时,确保理解过滤器的行为。上面的例子中,错误日志appender使用了LevelRangeFilter,只接受ERROR和FATAL级别的日志。其他级别的日志会被该appender忽略。 通过以上配置,我们可以实现日志存储到多个日志文件。根据实际需求,可以组合使用不同的appender和logger配置,实现复杂的日志存储策略。 相关问题: §§相关问题§§ 1. 如何配置Log4net以将不同级别的日志输出到不同的文件2. Log4net中如何为不同的命名空间配置不同的日志文件? 3. 在Log4net中如何设置日志文件的滚动策略? 4. Log4net的过滤器有哪些类型?如何使用?</think>### C# Log4net 多文件日志存储配置指南 在C#中配置Log4net实现文件日志存储,需要通过多个`RollingFileAppender`定义不同的日志输出目标。以下是详细配置方法和示例: #### 核心配置方案 在`App.config`或`Web.config`中定义多个文件附加器(appender),每个附加器对应一个日志文件: ```xml <log4net> <!-- 主日志文件 --> <appender name="MainFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/main-log.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <!-- 错误专用日志 --> <appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/error-log.txt" /> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR" /> <levelMax value="FATAL" /> </filter> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level - %message%newline%exception" /> </layout> </appender> <!-- 特定模块日志 --> <appender name="ModuleFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs/module-log.txt" /> <filter type="log4net.Filter.LoggerMatchFilter"> <loggerToMatch value="MyApp.DataAccess" /> </filter> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %level - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="MainFileAppender" /> <appender-ref ref="ErrorFileAppender" /> <appender-ref ref="ModuleFileAppender" /> </root> </log4net> ``` #### 关键配置说明 1. **多文件定义**: - 每个`<appender>`定义独立的日志文件 - 通过`<file value="路径">`指定文件位置 2. **日志过滤机制**: - **级别过滤**:使用`LevelRangeFilter`只记录ERROR/FATAL日志 ```xml <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR" /> </filter> ``` - **命名空间过滤**:使用`LoggerMatchFilter`记录特定模块日志 ```xml <filter type="log4net.Filter.LoggerMatchFilter"> <loggerToMatch value="MyApp.DataAccess" /> </filter> ``` 3. **滚动策略优化**: - 按日期滚动:`<rollingStyle value="Date"/>` - 按大小滚动:`<rollingStyle value="Size"/>` - 组合策略:`<rollingStyle value="Composite"/>` 4. **代码初始化**: ```csharp public class DataAccessLayer { // 获取特定模块的Logger private static readonly ILog log = LogManager.GetLogger("MyApp.DataAccess"); public void ProcessData() { log.Info("数据库操作开始"); // ... } } ``` #### 验证多文件输出 运行程序后检查日志目录: ``` Logs/ ├── main-log.txt # 所有日志 ├── error-log.txt # 仅错误日志 └── module-log.txt # 特定模块日志 ``` #### 高级配置技巧 1. **异步写入提升性能**: ```xml <appender name="AsyncAppender" type="log4net.Appender.AsyncForwardingAppender"> <appender-ref ref="MainFileAppender" /> </appender> ``` 2. **自定义文件命名规则**: ```xml <file type="log4net.Util.PatternString" value="Logs/log_%property{logId}.txt" /> ``` 3. **动态路径设置**: ```csharp GlobalContext.Properties["logId"] = Guid.NewGuid(); ``` #### 注意事项 1. 确保日志目录存在或应用程序有创建权限 2. 生产环境建议使用异步Appender避免I/O阻塞 3. 定期清理旧日志文件,可通过`maxSizeRollBackups`限制数量 4. 不同Appender可使用独立滚动策略,如主日志按日滚动,错误日志按大小滚动 通过以上配置,您可以实现灵活的多文件日志存储策略,满足不同模块、不同级别的日志分离需求[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值