Proposal of Outputting Unified Logging to TCP socket

Koichi Sakata sakatakui at oss.nttdata.com
Tue Oct 11 11:27:04 UTC 2022


Hello Johan,

Thank you for reading the entire proposal! I'm sorry for late reply.

I understand that it might create a large attack vector, but that might 
be the same for Log4j2 and Logback because they have the TCP 
implementation, I think. I can see that maintenance costs will increase 
if we have this feature.

> My suggestion would be to use an external tool. The most basic of
> these would look like this:
> 
> Process 0:
> $ run_tcp_server localhost 4040
> Process 1:
> $ mkfifo my.log
> $ tail -f my.log | netcat localhost 4040
> Process 2:
> $ java -Xlog:disable -Xlog::my.log

Thank you for your suggestion. That's useful for me!

Regards,
Koichi Sakata

On 06-10-2022 01:15 AM, Johan Sjölén wrote:
> On 2022-10-04 16:21, Koichi Sakata wrote:
>> Hello,
>> 
>> I would like to propose outputting unified logging (UL) to the TCP 
>> socket. I know that this has been discussed before [1]. However, 
>> circumstances have changed. Asynchronous logging was added to UL. If 
>> we output logs to TCP with async mode, we will be able to solve some 
>> issues raised in the past discussion (e.g. lag of log() calls). So I 
>> will take up this subject again.
>> 
>> This feature is useful, especially in the container environment. Take 
>> Kubernetes for example, there are many containers. It is recommended 
>> that containers send logs to standard output, but the mixture of Java 
>> application logs and UL logs in stdout is not handy to parse or search 
>> in a log aggregator like Elasticsearch. I believe that it's beneficial 
>> to deal with each type of log individually.
>> 
>> When we have files of UL logs, we have another issue. That is where to 
>> persist those files. As you know, we lose logs when pods are removed. 
>> I would rather not use volumes like Persistent Volume because of the 
>> cost of using volumes and the effort of managing files. When using the 
>> volume, we need to determine the file size and the volume size and put 
>> many log files of containers in it.
>> 
>> UL via TCP socket answers these issues. In the Kubernetes example, we 
>> use a log forwarder like Fluent Bit, Filebeat or something as a 
>> DaemonSet. It gets UL logs from the socket, gets application logs from 
>> stdout, and sends each log to corresponding log aggregators. As a 
>> result, we don't have UL log files and volumes to persist them 
>> anymore. This is premised on asynchronous logging. So the lag will not 
>> be a problem, I think.
>> 
>> For these reasons, I would like to propose outputting UL logs to TCP 
>> inputs. It seems to be unnecessary for traditional java applications, 
>> but it's of great use for applications in container environments. This 
>> makes it easier to build and operate applications on Kubernetes. There 
>> is also a bonus that this is os independent.
>> 
>> I will create a prototype of this proposal if it is worth trying.
>> 
>> By the way, there is a network stream class that is used to send node 
>> information to Ideal Graph Visualizer via socket. I'm not sure whether 
>> we can divert it or not for this new feature.
>> 
>> Best Regards,
>> Koichi Sakata
>> 
>> [1] 
>> https://mail.openjdk.org/pipermail/hotspot-runtime-dev/2020-November/043221.html
> 
> Hi Koichi Sokata,
> 
> Thank you for your suggestion. I think that you're right, UL is in a
> better position to accept TCP sockets as output devices now than it
> was previously thanks to the introduction of asynchronous logging.
> However, I am skeptical to the idea of adding these to UL. It creates
> a rather large attack vector for us, it also creates a maintenance
> burden and finally getting this right for everyone is probably close
> to impossible.
> 
> Please note that the Ideal Graph Visualizer is a debug tool, it is not
> meant for use in production. Therefore, its requirements are very
> different to UL, which needs to be robust.
> 
> My suggestion would be to use an external tool. The most basic of
> these would look like this:
> 
> Process 0:
> $ run_tcp_server localhost 4040
> Process 1:
> $ mkfifo my.log
> $ tail -f my.log | netcat localhost 4040
> Process 2:
> $ java -Xlog:disable -Xlog::my.log
> 
> Where the initial -Xlog:disable disables any default configuration
> which would output to stdout.
> 
> I am sure that there are more sophisticated tools which works
> essentially like this.
> 
> Best regards,
> Johan Sjölén


More information about the hotspot-runtime-dev mailing list