Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何跟踪写入同一日志文件的多个线程_Linux_Tail - Fatal编程技术网

Linux 如何跟踪写入同一日志文件的多个线程

Linux 如何跟踪写入同一日志文件的多个线程,linux,tail,Linux,Tail,我有一个使用12个线程的python进程。所有线程都写入同一个日志文件 我用tail-f跟踪输出,但是正如您所想象的,如果您想跟踪单个进程,那么输出很难读取 需要遵循多个日志文件。它这样做,然后在一个窗口中显示每个日志 如何跟踪写入同一日志文件的多个线程?如果我正确理解您的问题,您会说:我这里有一个文件,我想知道该文件的哪一部分是由我程序的哪个线程编写的 恐怕这是不可能的:进程可能会锁定文件,这会导致文件和进程之间存在链接,但该文件和该进程内的任何线程之间没有链接。不要忘记,一旦您的进程释放了该

我有一个使用12个线程的python进程。所有线程都写入同一个日志文件

我用tail-f跟踪输出,但是正如您所想象的,如果您想跟踪单个进程,那么输出很难读取

需要遵循多个日志文件。它这样做,然后在一个窗口中显示每个日志


如何跟踪写入同一日志文件的多个线程?

如果我正确理解您的问题,您会说:我这里有一个文件,我想知道该文件的哪一部分是由我程序的哪个线程编写的

恐怕这是不可能的:进程可能会锁定文件,这会导致文件和进程之间存在链接,但该文件和该进程内的任何线程之间没有链接。不要忘记,一旦您的进程释放了该锁,您将无法再找到进程和文件之间的任何关系

正如João所建议的那样,您可能会更改进程,以便将特定于线程的信息添加到提到的文件中,但如果不更改进程,恐怕您所要求的是不可能的。

为此,我使用sed和stdbuf。。。和猛击

最简单的

sed-u->-无缓冲

sed-n->-安静,-安静

多个:

tail -f mylogfile |
    stdbuf -i0 -o0 tee >(
        sed -une /thread 1/p >file1
      ) >(
        sed -une /thread 2/p >file2
      ) >(
        sed -une '/thread 3/s/.*/INSERT INTO l_t_3 VALUES (DEFAULT,\o47&\o47);/p' |
             someSqlclient
      ) | 
        sed -une /last thread/p >lastfile

当然,file1和其他可能是fifo、file、unnamed fifo和通过socat或nc,还有很多其他东西…

作为一个想法,您可以将线程id添加到日志中,并执行多个tail-f | grep线程id。注意,您可以通过tail-f/log/domains*/access.log跟踪多个文件。@JoãoGuitana而不是多个tail-f,考虑尾F > CMD1> CMD2·CMD3!看看,谢谢你的评论。这不是我的意思:我有一个日志文件,这个日志文件有行,在这些行上有一个指示器,指示什么线程写了这行。问题是它很难阅读。理想情况下,我正在寻找一个进程,它在子窗口1中显示一行,如果线程1写了这行,子窗口2如果线程2写了这行,等等。啊,好的,你不能将tail-f和grep结合起来吗?比如tail-f logfile.log | grep>logfile?而您有另一个带有tail-f logfile?的子窗口?
-u, --unbuffered
     load minimal amounts of data from the input files and flush the output buffers more often
-n, --quiet, --silent
     suppress automatic printing of pattern space
tail -f mylogfile |
    stdbuf -i0 -o0 tee >(
        sed -une /thread 1/p >file1
      ) >(
        sed -une /thread 2/p >file2
      ) >(
        sed -une '/thread 3/s/.*/INSERT INTO l_t_3 VALUES (DEFAULT,\o47&\o47);/p' |
             someSqlclient
      ) | 
        sed -une /last thread/p >lastfile