开发和测试环境应用任务日志丢失问题

本文探讨了在特定环境下日志记录不完整的问题,并详细分析了原因,包括log4j配置、启动脚本及日志文件操作等。提出了两种解决策略,即在启动脚本中加入指定log4j配置文件和移除DaemonLogger组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象



跑了个任务,按道理来说应该会在daemon的主日志里打一大堆错误信息,结果vi打开,日志里面什么内容的没有。

用tail -f看主日志,然后跑任务,发现打出的内容如下:

{code}
tail: daemon.log: file truncated
....
2011-11-08 19:17:58,749 [] ERROR daemon.JobMain - Exception:
com.alibaba.dubbo.rpc.RpcException: No provider available for service com.alibaba.china.credit.group.core.service.GroupMemberInfoQueryService on consumer 10.20.172.25 use dubbo version 2.0.5, Please check whether the service do exist or version is right firstly, and check the provider has started.
	at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:51)
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:168)
	at com.alibaba.dubbo.rpc.proxy.filter.MockFilter.invoke(MockFilter.java:86)
	at com.alibaba.dubbo.rpc.filter.FilterChainBuilder$1.invoke(FilterChainBuilder.java:61)
	at com.alibaba.dubbo.rpc.proxy.filter.LocalFilter.invoke(LocalFilter.java:92)
	at com.alibaba.dubbo.rpc.filter.FilterChainBuilder$1.invoke(FilterChainBuilder.java:61)
	at com.alibaba.dubbo.rpc.proxy.support.InvokerHandler.invoke(InvokerHandler.java:44)
	at com.alibaba.dubbo.common.bytecode.proxy17.listMemberIdsByParam(proxy17.java)
	at com.alibaba.china.levit.daemon.guarantee.service.impl.CheckGroupMemberMoneyServiceImpl.processCheck(CheckGroupMemberMoneyServiceImpl.java:70)
	at com.alibaba.china.levit.daemon.guarantee.AutoCheckGroupMemberMoneyJob.execute(AutoCheckGroupMemberMoneyJob.java:27)
	at com.alibaba.china.levit.daemon.JobMain.main(JobMain.java:69)
tail: daemon.log: file truncated
{code}

因为最后文件被truncated,所以日志文件里面什么内容都木有


问题排查



首先怀疑是appender配置的有点问题,查看应用的log4j配置,在非生产环境的append设置的是false,这样可以解释上面日志中头部的file truncated是因为任务启动的时候初始化弄掉的,不过不能解释最后的那一个。

{code}
<appender name="PROJECT" class="com.alibaba.common.logging.spi.log4j.DailyRollingFileAppender">
        <param name="file" value="${levit_loggingRoot}/daemon/sys/daemon/daemon.log"/> #if($levit_production == "true") <param name="append"
        value="true"/> #else <param name="append" value="false"/> #end <param name="encoding" value="GBK"/>
        <param name="threshold" value="info"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
        </layout>
    </appender>
{code}

查看任务启动脚本,发现在任务启动后会执行一个spy.sh的脚本,用来监控任务运行的相关信息,脚本部分内容如下:

{code}
...
$JAVA_LOG com.alibaba.china.credit.common.daemon.task.DaemonLogger  "start" "$hostIp" "$taskId" "$startTimeMillis" "$taskName" "$hostName" "$shCommand" "$operator"


while true;do
        findProcess=`ps -ef|awk '{print $2}'|grep $taskId|grep -v "grep"`
        if [ "x$findProcess" = "x" ];then
                echo "process [$hostIp,$taskId,$taskName,$startTimeMillis] is not exist!so , I can die!!!"
                $JAVA_LOG com.alibaba.china.credit.common.daemon.task.DaemonLogger "end" "$hostIp" "$taskId" "$startTimeMillis"
                exit
        else
                sleep 10s
        fi
done
{code}

从代码中可以看出,会通过命令行的方式启动了两个jvm。


运行类的其中一个基类DaoSupport用到了log4j相关功能。


因为没有显式的指定log4j目录,所以按照默认路径查找,找到了配置给daemon的log4j文件。


因为PROJECT appender的appender=false,所以运行新的jvm会导致文件的truncate,所以出现上述情况。


解决方案



1. 在启动脚本中加入-Dlog4j.configuration= ,执行自定义的其他的log4j配置文件


2. 干掉DaemonLogger这个东东

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值