Skip to content

Commit 3d0d6cc

Browse files
committed
Container: T7473: Fix show/monitor container log failed when log-driver is journald
1 parent 5dd5e74 commit 3d0d6cc

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

op-mode-definitions/container.xml.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
<path>container name</path>
9090
</completionHelp>
9191
</properties>
92-
<command>sudo podman logs --follow --names "$4"</command>
92+
<command>sudo ${vyos_op_scripts_dir}/container.py show_log --follow --name "$4"</command>
9393
</tagNode>
9494
</children>
9595
</node>
@@ -133,7 +133,7 @@
133133
</completionHelp>
134134
</properties>
135135
<!-- no admin check -->
136-
<command>sudo podman logs --names "$4"</command>
136+
<command>sudo ${vyos_op_scripts_dir}/container.py show_log --name "$4"</command>
137137
</tagNode>
138138
<node name="network">
139139
<properties>
@@ -162,7 +162,7 @@
162162
<path>container name</path>
163163
</completionHelp>
164164
</properties>
165-
<command>sudo podman logs --names "$4"</command>
165+
<command>sudo ${vyos_op_scripts_dir}/container.py show_log --name "$4"</command>
166166
</tagNode>
167167
</children>
168168
</node>

src/op_mode/container.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import json
1818
import sys
19+
import subprocess
1920

2021
from vyos.utils.process import cmd
2122
from vyos.utils.process import rc_cmd
@@ -32,6 +33,26 @@ def _get_raw_data(command: str) -> list:
3233
data = json.loads(json_data)
3334
return data
3435

36+
def _get_container_log_type(name: str) -> str:
37+
"""
38+
Determines the log type for a given container name by inspecting it.
39+
Returns the log type string.
40+
"""
41+
try:
42+
container_info_list = _get_raw_data(f'podman container inspect {name}')
43+
if not container_info_list:
44+
raise vyos.opmode.Error(f"Container '{name}' not found.")
45+
except Exception as e:
46+
raise vyos.opmode.Error(f"Container '{name}' not found.") from e
47+
48+
container_info = container_info_list[0]
49+
log_config = container_info.get('HostConfig', {}).get('LogConfig', {})
50+
log_type = log_config.get('Type')
51+
52+
if not log_type:
53+
raise vyos.opmode.InternalError(f"Could not determine log type for container '{name}'")
54+
return log_type
55+
3556
def add_image(name: str):
3657
""" Pull image from container registry. If registry authentication
3758
is defined within VyOS CLI, credentials are used to login befroe pull """
@@ -109,6 +130,39 @@ def restart(name: str):
109130
print(f'Container "{name}" restarted!')
110131
return output
111132

133+
def show_log(name: str, follow: bool = False, **kwargs):
134+
"""
135+
Show or monitor logs for a specific container.
136+
Use --follow to continuously stream logs.
137+
"""
138+
log_type = _get_container_log_type(name)
139+
if log_type == 'k8s-file':
140+
if follow:
141+
log_command_list = ['sudo', 'podman', 'logs', '--follow', '--names', name]
142+
else:
143+
log_command_list = ['sudo', 'podman', 'logs', '--names', name]
144+
if log_type == 'journald':
145+
if follow:
146+
log_command_list = ['journalctl', '--follow', '--unit', f'vyos-container-{name}.service']
147+
else:
148+
log_command_list = ['journalctl', '-e', '--no-pager', '--unit', f'vyos-container-{name}.service']
149+
150+
process = None
151+
try:
152+
process = subprocess.Popen(log_command_list,
153+
stdout=sys.stdout,
154+
stderr=sys.stderr)
155+
process.wait()
156+
except KeyboardInterrupt:
157+
if process:
158+
process.terminate()
159+
process.wait()
160+
return None
161+
except Exception as e:
162+
raise vyos.opmode.InternalError(f"Error starting logging command: {e} ")
163+
return None
164+
165+
112166
if __name__ == '__main__':
113167
try:
114168
res = vyos.opmode.run(sys.modules[__name__])

0 commit comments

Comments
 (0)