将命令行参数记录到log4j中

时间:2011-10-18 14:30:02

标签: java linux java-ee log4j linux-kernel

在我的java代码中,我创建了执行某些shell命令的场景,特别是执行了-scp--mv-命令。 是否可以记录执行结果?例如,如果找不到要复制的文件,或者-scp--mv-未正确发生,则会记录到我准备好的日志文件中。目前我的命令执行代码如下:

  if ("command") {
                String command = "mv " + source_file_path + "/"
                        + " " + dest_file_path;
                Process child = Runtime.getRuntime().exec(command);
                exitVal = child.waitFor();

                // Get the input stream and read from it
                InputStream in = child.getInputStream();

                BufferedInputStream bis = new BufferedInputStream(in);
                ByteArrayOutputStream buf = new ByteArrayOutputStream();
                int c = bis.read();

                while (c != -1) {
                    byte b = (byte) c;
                    buf.write(b);
                    c = bis.read();
                }
                in.close();
                System.out.println("Input Stream: " + buf.toString());
                buf.close();
                bis.close();
                InputStream ein = child.getErrorStream();
                BufferedInputStream ebis = new BufferedInputStream(ein);
                ByteArrayOutputStream ebuf = new ByteArrayOutputStream();
                int ce = ebis.read();

                while (ce != -1) {
                    // process((char)c);
                    byte be = (byte) ce;
                    ebuf.write(be);
                    ce = ebis.read();
                }
                ein.close();
                System.out.println("Error Stream: " + ebuf.toString());
                ebuf.close();
                ebis.close();   
        }   
        System.exit(0);

无论如何我可以在其上添加日志记录组件吗?要记录未找到文件的时间,当文件传输不正确时,文件传输出现问题时..等等

1 个答案:

答案 0 :(得分:1)

解析您在名为buf的ByteArrayOutputStream中捕获的命令的输出以确定结果并记录它。您还可以从exitVal中获得一条线索,该线索存储在{{1}}。

请注意,通过在读取stdout和stderr流之前调用child.waitFor(),您可以保证如果进程的输出太大,这将不起作用。根据{{​​3}}:“因为某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。“