You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:38:01