Log4Net控制台应用输出文件目录配置问题咨询
嘿,刚看到你的问题,作为踩过log4net不少坑的老用户,我来帮你捋捋为啥会出现这种情况~
你遇到的核心问题其实是控制台应用的运行工作目录和你项目的根目录不是一回事。默认情况下,调试控制台应用时,程序会在bin/Debug(或bin/Release)这样的输出目录里运行,所以你写的相对路径是相对于这个输出目录,而不是你项目文件所在的根目录。这就是为啥你必须写绝对路径才能生成日志文件的原因。
下面给你几个实用的解决方案:
方案1:用相对路径,确保配置文件和日志输出到工作目录
这是最简单的做法,让日志生成在程序实际运行的目录(也就是输出目录):
首先处理你的
log4net.config文件:- 在Visual Studio里右键点击这个文件,选择「属性」
- 把「复制到输出目录」改成「如果较新则复制」或者「始终复制」,这样调试时配置文件会被自动复制到
bin/Debug目录下
修改配置里的
file节点为相对路径,顺便修正一个拼写小错误:<appender name="file" type="log4net.Appender.RollingFileAppender"> <!-- 改成相对路径,日志会生成在程序运行的工作目录(bin/Debug) --> <file value="loggingfun.log" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="5" /> <maximumFileSize value="25MB" /> <!-- 注意这里原来的lockingmodel拼写错误,应该是lockingModel(首字母大写M) --> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> </layout> </appender>你的
Program.cs代码不用改,只要确保log4net.config能被正确加载(因为已经复制到输出目录了,File.OpenRead("log4net.config")就能找到)
方案2:让日志生成在项目根目录(而非输出目录)
如果你希望日志直接出现在项目根目录下,可以通过动态设置路径的方式实现:
修改配置文件的
file节点,使用log4net的全局属性占位符:<file value="%property:ProjectRootPath%loggingfun.log" />在加载log4net配置之前,在代码里设置这个全局属性:
static void Main(string[] args) { // 获取项目根目录路径(这里假设输出目录在bin/Debug,所以往上跳3级) string projectRoot = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../")); // 设置log4net全局属性 log4net.GlobalContext.Properties["ProjectRootPath"] = projectRoot; XmlDocument log4netConfig = new XmlDocument(); log4netConfig.Load(File.OpenRead("log4net.config")); var repo = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy)); XmlConfigurator.Configure(repo, log4netConfig["log4net"]); var logger = LogManager.GetLogger(typeof(Program)); logger.Error("Hello, World!"); }这种方式的好处是日志会直接出现在你的项目根目录下,不用去bin目录找,但要注意:如果你的项目结构变化(比如输出目录位置改了),可能需要调整
../../../的层级数。
额外小技巧
调试时可以加一行Console.WriteLine(Directory.GetCurrentDirectory()),这样你就能清楚看到当前程序的工作目录,再也不用猜相对路径对应哪个文件夹了~
内容的提问来源于stack exchange,提问作者user1574598

