自定义Log4Net缓存型RollingFileAppender刷新时出现‘文件当前未被锁定’异常导致日志无法写入的问题求助
自定义Log4Net缓存型RollingFileAppender刷新时出现‘文件当前未被锁定’异常导致日志无法写入的问题求助
各位大佬好,我现在在.NET Standard 2.0类库里自定义一个带缓存的RollingFileAppender,目的是让日志先攒在缓存里,定期或者达到阈值再刷盘,这样后续做压缩加密处理会更高效。但现在遇到个棘手的问题:用定时器触发缓存刷新的时候,调用Writer.WriteLine时,Appender的Writer对象里的ErrorHandler报出**"The file is not currently locked"**异常,日志根本写不进去。
我已经尝试过这些方法,但都没解决问题:
- 初始化Appender对象时,在调用
appender.ActivateOptions();之前设置appender.LockingModel = new FileAppender.MinimalLock(); - 访问Writer之前调用
LockingModel.AcquireLock(),写完之后再调用LockingModel.ReleaseLock() - 把整个刷新逻辑包裹在自己的lock代码块里
- 考虑过用
PatternLayoutConverter来处理日志,但因为多个Appender会共用同一个静态转换器,逻辑会变得非常混乱,所以暂时放弃了这个方案
下面是我这个Appender的半成品实现代码:
private readonly ConcurrentQueue<string> _buffer = new ConcurrentQueue<string>(); private readonly Timer _flushTimer; public int BufferSizeThreshold { get; set; } = 250; public TimeSpan BufferFlushInterval { get; set; } = TimeSpan.FromSeconds(5); public EncryptingCompressingRollingAppender() { _flushTimer = new Timer(_ => Flush(), null, BufferFlushInterval, BufferFlushInterval); } protected override void Append(LoggingEvent loggingEvent) { var rendered = RenderLoggingEvent(loggingEvent); _buffer.Enqueue(rendered); if (_buffer.Count >= BufferSizeThreshold) { Flush(); } } private void Flush() { if (_buffer.IsEmpty) return; // 将缓存全部出队拼接成字符串 var log = DequeueBufferToString(); if (string.IsNullOrEmpty(log)) return; // 压缩并加密缓存内容 var compressed = Compress(log); var encrypted = Encrypt(compressed); // 写入文件(因为不是二进制文件,这里加密后是Base64格式) Writer.WriteLine(encrypted); // 就是这里抛出异常 }
有没有大佬遇到过类似的问题?或者能给我指个方向怎么解决这个锁定异常的问题?
内容来源于stack exchange
相关产品推荐
相关产品推荐

