Hello, I am forwarding my application logs to stdout and stderr, but I can only see stderr logs with “docker logs container_id”. Unfortunately, I can’t get the stdout logs. This is a java application. How can I debug this? There is no problem when I try it in Nginx or Apache.
Are you sure your root logger and all other loggers you configured are pointing to the console logger (which itself writes its output to STDOUT)?
Thanks for the answer.
I use as follows on Dockerfile.
RUN ln -sf /dev/stdout /opt/webapp/app.log
I think I don’t need to change anything on the java side.
But it’s not working, is it?
Isn’t it cleaner to solve a configuration problem, where the configuration actualy needs to be done?!
This is definititly not a java problem, as a proper configured logger would not result in the problem you are having.
The docker logs command shows information logged by a running container. The docker service logs command shows information logged by all containers participating in a service. The information that is logged and the format of the log depends almost entirely on the container’s endpoint command.
By default, docker logs or docker service logs shows the command’s output just as it would appear if you ran the command interactively in a terminal. UNIX and Linux commands typically open three I/O streams when they run, called STDIN, STDOUT, and STDERR. STDIN is the command’s input stream, which may include input from the keyboard or input from another command. STDOUT is usually a command’s normal output, and STDERR is typically used to output error messages. By default, docker logs shows the command’s STDOUT and STDERR. To read more about I/O and Linux, see the Linux Documentation Project article on I/O redirection.
In some cases, docker logs may not show useful information unless you take additional steps.
If you use a logging driver which sends logs to a file, an external host, a database, or another logging back-end, docker logs may not show useful information.
If your image runs a non-interactive process such as a web server or a database, that application may send its output to log files instead of STDOUT and STDERR.
In the first case, your logs are processed in other ways and you may choose not to use docker logs. In the second case, the official nginx image shows one workaround, and the official Apache httpd image shows another.
The official nginx image creates a symbolic link from /var/log/nginx/access.log to /dev/stdout, and creates another symbolic link from /var/log/nginx/error.log to /dev/stderr, overwriting the log files and causing logs to be sent to the relevant special device instead. See the Dockerfile.
The official httpd driver changes the httpd application’s configuration to write its normal output directly to /proc/self/fd/1 (which is STDOUT) and its errors to /proc/self/fd/2 (which is STDERR). See the Dockerfile.