一次python3服务器500错误文件日志打印不出的事件

线上遇到一个问题,服务器返回500错误,但是没有任何日志输出 我们使用的是loguru 0.5.3版本,打印日志,同时输出到文件和标准输出流,当然标准输出流是没法看了,直接重定向/dev/null 了 怀疑是loguru出了问题 在内网复现后,把服务器放到前台,标准输出流果然有日志出现

xmlrpc.client.Fault: <Fault 1: "<class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 12, column 79">

--- Logging error in Loguru Handler [#2](https://laidback.montaigne.io/tags/2) ---

Record was: None

Traceback (most recent call last):

  File "/usr/local/python3/lib/python3.8/site-packages/loguru/_handler.py", line 272, in _queued_writer

    message = queue.get()

  File "/usr/local/python3/lib/python3.8/multiprocessing/queues.py", line 358, in get

    return _ForkingPickler.loads(res)

TypeError: __init__() missing 2 required positional arguments: 'faultCode' and 'faultString'

--- End of logging error ---

这看起来有些费解。我们是使用了loguru的 非同步打印日志的方式,用于多进程的情况下,它会把日志放到一个队列里,然后有个单独线程从这个队列里取到这个值,这中间python底层是用到pickle来做序列化。 xmlrpc.client.Fault定义如下

class Fault(Error):
    """Indicates an XML-RPC fault package."""
    def __init__(self, faultCode, faultString, **extra):
        Error.__init__(self)
        self.faultCode = faultCode
        self.faultString = faultString
    def __repr__(self):
        return "<%s %s: %r>" % (self.__class__.__name__,
                                self.faultCode, self.faultString)

查了些资料后发现 python - Cannot unpickle Exception subclass - Stack Overflow (python3.5 前的一个类似错误) https://github.com/python/cpython/blob/main/Objects/exceptions.c#L144 (BaseException的reduce方法)

static PyObject *
BaseException_reduce(PyBaseExceptionObject *self, PyObject *Py_UNUSED(ignored))
{
    if (self->args && self->dict)
        return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
    else
        return PyTuple_Pack(2, Py_TYPE(self), self->args);
}

Fault继承于Exception, Exception继承于BaseException,BaseException有个属性叫args 问题就出在Fault的init函数里 Error.init(self) 这一行,等于args属性最后是空的, 反序列化的时候会调用 reduce 会返回Fault类和空的args,然后用它们实例化Fault类,那就出错了, 因为Fault需要两个位置参数 faultCode, faultString 也就是我们开始看到的错误。 回到开始的问题,作者已经修复了无法反序列化这个问题, https://github.com/Delgan/loguru/pull/963 只要升级loguru到0.7.2就行

### 解决 anythingllm 无法读取上传文件的问题 当面对 anythingllm 无法读取上传文件的情况时,可以从多个角度排查并解决问题。 #### 文件上传过程中的常见错误处理 如果遇到的是由于文件过大而引起的传输中断或失败问题,则可以考虑采用分片上传的方式。通过将大文件分割成较小的部分依次上传,在服务器端再利用 `RandomAccessFile` 或者更高效的 NIO包下的 `MappedByteBuffer` 进行拼接恢复原文件[^2]。这种方法不仅提高了单次请求的成功率,也使得断点续传成为了可能。 对于具体的实现方式: - 使用 `RandomAccessFile` 实现的函数名为 `uploadFileRandomAccessFile()`; - 基于 `MappedByteBuffer` 的优化版本则是 `uploadFileByMappedByteBuffer()` 函数; 这两种方法都能够有效地完成文件片段向原始文件的重组工作。 #### 网络连接稳定性验证 另外值得注意的一点是网络状况也可能影响到文件能否成功被 anythingllm 所接收。因此建议先确认当前环境下的互联网连接质量良好,并且尝试过重启设备以及相关服务之后再来测试是否依旧存在问题[^3]。 #### 工具的选择与配置调整 考虑到不同工具之间可能存在兼容性差异,选用合适的开发平台同样重要。例如 LM Studio 就是一个不错的选择,它提供了直观易用的操作界面用于设置模型参数和服务地址等必要选项[^4]。 综上所述,针对 anythingllm 无法正常解析所提交的数据对象这一现象,应该综合考量上述几个方面来进行针对性修复。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值