ホームページ >バックエンド開発 >Golang >コマンド出力をリアルタイムでコンソールとログファイルに同時にリダイレクトするにはどうすればよいですか?

コマンド出力をリアルタイムでコンソールとログファイルに同時にリダイレクトするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-04 07:42:02589ブラウズ

How to Redirect Command Output to Console and Log File Simultaneously in Real Time?

コマンド出力をリアルタイムでコンソールとログ ファイルに同時にリダイレクトする方法

提供されたコードは、コマンドの stdout と stderr を出力します。コンソールにはありますが、リアルタイムでファイルに記録する機能がありません。この記事では、MultiWriter を使用して、次の基準を遵守しながらログ記録とコンソール出力を同時に実現するソリューションを紹介します:

  • コンソールへのリアルタイム出力
  • ログ ファイル内の出力の正確なレプリケーション
  • 書き込み順序の尊重
  • 実行されたコマンドの変更なし

スキャナー、io.Copy、およびその他の技術を使用した以前の試みでは、出力順序を維持できませんでしたゴルーチン間の潜在的な競合状態が原因です。

解決策: MultiWriter の使用

この解決策は、複数の宛先に同時に書き込むことができる io.MultiWriter タイプを利用します。修正されたコードは次のとおりです。

<code class="go">package main

import (
    "io"
    "log"
    "os"
    "os/exec"
)

func main() {
    // Logging capability
    f, err := os.OpenFile("log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("Error opening file: %v", err)
    }
    defer f.Close()
    mwriter := io.MultiWriter(f, os.Stdout)
    cmd := exec.Command("ls")
    cmd.Stderr = mwriter
    cmd.Stdout = mwriter
    err = cmd.Run() //blocks until sub process is complete
    if err != nil {
        panic(err)
    }
}</code>

MultiWriter インスタンス mwriter は、ログ ファイルと標準出力を結合します。コマンドに Stdout と Stderr を指定する場合は、mwriter を使用して、コンソール出力とロギングの両方が同時に行われるようにします。

以上がコマンド出力をリアルタイムでコンソールとログファイルに同時にリダイレクトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。