55305


# 環境

  * Python 3.7.3
  * logging v0.5.1.2

# 質問

Pythonのドキュメントには、`logging.StreamHandler`クラスの説明が以下の通り記載されています。

> StreamHandler クラスの新たなインスタンスを返します。 stream
> が指定された場合、インスタンスはログ出力先として指定されたストリームを使います; そうでない場合、 sys.stderr が使われます。

<https://docs.python.org/ja/3/library/logging.handlers.html#logging.StreamHandler>

なぜデフォルトのstreamがstdoutでなくstderrなのでしょうか？  
ログ情報は「エラー」ではないので、stdoutの方が自然のように思います。

# 疑問に思った経緯

私はもともと、Pythonより前にJavaを使っていました。  
JavaのLogbackの`ConsoleAppender`では、デフォルトのstreamは`System.out`です。

>
> ConsoleAppenderは名前のとおり、ロギングイベントをコンソールに出力します。正確に言うと、System.outあるいはSystem.errに出力します。デフォルトではSystem.outが使われます。

<https://logback.qos.ch/manual/appenders_ja.html#ConsoleAppender>

デフォルトがstdoutであることが一般的だと思っていたので、Pythonのloggingのデフォルトストリームがstderrであることに、疑問を持ちました。


CC BY-SA 4.0
2019-05-27T17:24:41.297
55296
2019-05-28T03:16:58.550
2019-05-28T01:36:51.123
3060
19524
question
python java
`logging.StreamHandler`のデフォルトのstreamは、なぜstdoutでなくstderrなのでしょうか？


オイラ的にはログの出力先は標準エラーであることに違和感は何一つないのですが、慣れの問題なのかもしれません。標準出力はあくまで「実行結果」標準エラーは「その際に伴う診断メッセージ」つまり、ログは標準エラーに出力される、というのが商用
UNIX の世界では当たり前だと思っています。現に

  * あまり使われていないのでしょうが `java.util.logging` の出力先も標準エラー
  * `gcc` 等のエラーメッセージの出力先も標準エラー

なのでそういう伝統に則っただけなんだと思います。


CC BY-SA 4.0
2019-05-28T02:14:35.407
55300
2019-05-28T02:14:35.407
8589
55296
answer


@774RRさんの回答に補足すると、以下の記事が@yuji38kwmtさんの質問の参照とは逆に、Javaでもなぜjava.util.logging.Loggerはstderrに出力するか？となっています。  
回答によると Java 1.4 からの仕様ということと、GNUの解説にも一般的な概念が書かれています。

[Why does java.util.logging.Logger print to
stderr?](https://stackoverflow.com/q/34156052/9014308)

> I would expect to get an output on the `stdout`, just like using
> `System.out.println();`.  
>  **But instead** it gets printed out on the `stderr`, which results in a red
> font on the eclipse console:
>
> I know that I can change this behavior by writing a custom `Handler`, but I
> wish to know why the default output appears on the `stderr` instead of
> `stdout`?  
>  A logger should use `stdout` for `fine`+`info` and use `stderr` for
> `severe` level.

回答  
[Java Programming Java Logging
Framework](http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html)

> **Dissecting the Program**
>
>   * By default, the logger outputs log records of level INFO and above
> (i.e., INFO, WARNING and SEVERE) to standard error stream (System.err).  
>
> 訳：デフォルトでは、ロガーはレベルINFO以上のログレコード（すなわち、INFO、WARNING、SEVERE）を標準エラーストリーム（System.err）に出力します。
>

>
> **Class Handler**  
>  Each logger can have access to one or more handlers. The Logger forwards
> LogRecords (on or above the logger's level) to all its registered handlers.
> The handler exports them to an external device. You can also assign a Level
> to a handler to control the outputs. The following handlers are provided:
>
>   * ConsoleHandler: for writing to System.err.
>   * StreamHandler: for writing to an OutputStream.
>   * FileHandler: for writing to either a single log file, or a set of
> rotating log files.
>   * SocketHandler: for writing to a TCP port.
>   * MemoryHandler: for writing to memory buffers.
>

[JSR 47: Logging API Specification](https://www.jcp.org/en/jsr/detail?id=47)  
[Java™ Logging
Overview](https://docs.oracle.com/javase/7/docs/technotes/guides/logging/overview.html)  
[Package
java.util.logging](https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-
summary.html)

* * *

[The GNU C Library 12.2 Standard
Streams](https://www.gnu.org/software/libc/manual/html_node/Standard-
Streams.html)

> Variable: FILE * stderr  
>  The standard error stream, which is used for error messages and diagnostics
> issued by the program.
>
> 訳：標準エラーストリーム、プログラムによって発行されたエラーメッセージおよび **診断** に使用される。

* * *

おそらく、logbackというパッケージの主目的が「ログを処理すること」だから、デフォルトの出力先がstdoutになっているのでは？

[Logback Project](https://logback.qos.ch/index.html)

> Logback is intended as a successor to the popular log4j project, picking up
> where log4j leaves off.


CC BY-SA 4.0
2019-05-28T03:11:54.513
55305
2019-05-28T03:16:58.550
2020-06-17T08:14:45.997
-1
26370
55296
answer