【问题标题】:Logging from two simultaneous processes从两个同时进行的进程记录
【发布时间】:2016-08-24 07:45:12
【问题描述】:

我用 java 编写了一个应用程序并将其部署在 unix 服务器上。 我已经在我的应用程序中实现了日志记录,并且日志是在一个文件中生成的,比如X.log.txt

如果我使用不同的用户或单个用户的不同会话运行我的 jar 的多个实例:
我在 X.log.txt 中的登录是否有可能混在一起?
还是采用 FCFS 方式??


示例:假设 P1 和 P2 是两个正在调用 java 应用并正在生成日志的进程。

P1 和 P2 正在同时将各自的日志写入 X.log.txt。这个说法是真的吗?还是完全基于CPU调度算法(FCFS、SJF等)?

即使我不使用时间戳,它对我来说也可以正常工作。 当我执行它们时,日志会一个接一个地生成,这意味着对于特定实例,所有日志都将写入文件,然后再写入下一个实例。我的问题仍然悬而未决,这一切都是基于我们的处理器为处理工作而编写的方式,还是其他原因?

【问题讨论】:

    标签: java unix logging operating-system multiprocessing


    【解决方案1】:

    如果两个进程正在写入同一个日志文件,数据将随机损坏。您将在中间切线并使用其他日志中的数据完成。您甚至可以在文件的不同位置得到大量二进制零,具体取决于操作系统(在某些操作系统中,它只会无法同时从两个位置写入同一个文件)。

    写入单独的文件,然后使用一些 3rd 方工具加入/浏览它们以获得按时间戳排序的视图。

    【讨论】:

    • 或通过发送到日志进程来记录,该进程接受来自多个来源的完整日志消息,并将它们写入单个日志文件。 (就像syslog,因为 OP 在 Unix 系统上)。
    【解决方案2】:

    如果您的两个进程都写入相同的目录和文件路径,您会得到一些奇怪的行为。根据您的实现,两个应用程序将同时写入文件,或者一个应用程序将完全阻止另一个应用程序写入。

    我的建议是在运行时生成日志文件的名称并附加一些独特的东西,例如时间戳或 pid(进程 ID),这样就不会再发生冲突了:

    X.log.[PID].txtX.log.[TIMESTAMP].txt

    注意:您必须在时间戳中使用足够低的分辨率(秒或纳秒)以避免名称冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多