Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Get logs from all pods in namespace using xargs

Is there anyway to get all logs from pods in a specific namespace running a dynamic command like a combination of awk and xargs?

 kubectl get pods | grep Running | awk '{print $1}' | xargs kubectl logs | grep value

I have tried the command above but it’s failing like kubectl logs is missing pod name:

error: expected ‘logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]’.
POD or TYPE/NAME is a required argument for the logs command
See ‘kubectl logs -h’ for help and examples

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Do you have any suggestion about how get all logs from Running pods?

>Solution :

Think about what your pipeline is doing:

The kubectl logs command takes as an argument a single pod name, but through your use of xargs you’re passing it multiple pod names. Make liberal use of the echo command to debug your pipelines; if I have these pods in my current namespace:

$ kubectl get pods -o custom-columns=name:.metadata.name
name
c069609c6193930cd1182e1936d8f0aebf72bc22265099c6a4af791cd2zkt8r
catalog-operator-6b8c45596c-262w9
olm-operator-56cf65dbf9-qwkjh
operatorhubio-catalog-48kgv
packageserver-54878d5cbb-flv2z
packageserver-54878d5cbb-t9tgr

Then running this command:

kubectl get pods | grep Running | awk '{print $1}' | xargs echo kubectl logs

Produces:

kubectl logs catalog-operator-6b8c45596c-262w9 olm-operator-56cf65dbf9-qwkjh operatorhubio-catalog-48kgv packageserver-54878d5cbb-flv2z packageserver-54878d5cbb-t9tgr

To do what you want, you need to arrange to call kubectl logs multiple times with a single argument. You can do that by adding -n1 to your xargs command line. Keeping the echo command, running this:

kubectl get pods | grep Running | awk '{print $1}' | xargs -n1 echo kubectl logs

Gets us:

kubectl logs catalog-operator-6b8c45596c-262w9
kubectl logs olm-operator-56cf65dbf9-qwkjh
kubectl logs operatorhubio-catalog-48kgv
kubectl logs packageserver-54878d5cbb-flv2z
kubectl logs packageserver-54878d5cbb-t9tgr

That looks more reasonable. If we drop the echo and run:

kubectl get pods | grep Running | awk '{print $1}' | xargs -n1 kubectl logs | grep value

Then you will get the result you want. You may want to add the --prefix argument to kubectl logs so that you know which pod generated the match:

kubectl get pods | grep Running | awk '{print $1}' | xargs -n1 kubectl logs --prefix | grep value

Not directly related to your question, but you can lose that grep:

kubectl get pods | awk '/Running/ {print $1}' | xargs -n1 kubectl logs --prefix | grep value

And even lose the awk:

kubectl get pods --field-selector=status.phase==Running -o name | xargs -n1 kubectl logs --prefix | grep value
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading