基于命令行参数的log4net多文件夹日志配置需求
看来你需要实现一个按州代码隔离日志、同时保证单州单实例的应用,我给你整理一套完整的实现方案,结合你提到的string.Format来配置:
完整实现步骤
1. 解析命令行参数获取州代码
首先要确保能正确拿到传入的州代码,并且做基础校验:
string[] args = Environment.GetCommandLineArgs(); // 第一个参数是程序自身路径,所以需要至少2个参数才有效 if (args.Length < 2) { Console.WriteLine("请传入州代码作为命令行参数,例如:MyApp.exe WI"); Environment.Exit(1); } // 统一转大写,避免WI/wi这类大小写差异导致的文件夹不一致 string stateCode = args[1].Trim().ToUpper();
2. 创建州代码对应的日志文件夹
用string.Format拼接路径,再自动创建文件夹(不存在则创建,存在则无操作):
// 用string.Format格式化日志目录路径 string logRootDir = @"C:\MyAppLogs"; string stateLogDir = string.Format(@"{0}\{1}", logRootDir, stateCode); // 自动创建文件夹,无需判断是否存在 Directory.CreateDirectory(stateLogDir);
3. 保证同一州仅一个实例运行
使用**互斥锁(Mutex)**实现跨进程的单实例控制,锁名绑定州代码确保唯一性:
// 用州代码作为互斥锁的唯一标识,Global前缀确保跨会话生效 using (Mutex stateMutex = new Mutex(true, $"Global\\MyApp_SingleInstance_{stateCode}", out bool isNewInstance)) { if (!isNewInstance) { Console.WriteLine($"州代码 {stateCode} 的应用实例已经在运行,请勿重复启动!"); Environment.Exit(1); } // 初始化日志到目标文件夹 SetupLogging(stateLogDir); // 这里写你的应用核心业务逻辑 Console.WriteLine($"应用启动成功!州代码:{stateCode},日志目录:{stateLogDir}"); Console.ReadLine(); // 保持进程运行,实际场景可替换为服务循环 }
4. 日志配置示例(结合string.Format)
以常用的NLog为例,展示如何用string.Format配置日志文件路径:
private static void SetupLogging(string logDir) { var logConfig = new LoggingConfiguration(); // 用string.Format指定日志文件的完整路径 var fileTarget = new FileTarget("stateLogFile") { FileName = string.Format(@"{0}\app_{1}.log", logDir, DateTime.Now.ToString("yyyyMMdd")), Layout = "${longdate} | ${level} | ${message}" }; logConfig.AddRule(LogLevel.Info, LogLevel.Fatal, fileTarget); LogManager.Configuration = logConfig; }
如果是使用配置文件(如nlog.config),也可以直接通过命令行参数变量实现:
<targets> <target name="stateLog" xsi:type="File" fileName="${basedir}/${commandline:index=1:uppercase=true}/app_${date:format=yyyyMMdd}.log" layout="${longdate} | ${level} | ${message}" /> </targets>
内容的提问来源于stack exchange,提问作者user441521
相关产品推荐
相关产品推荐

