1

I am used to SLF4J in Java and logging in Python where I can have function names and line numbers as fields of my output format.

Emphasis on: line number

Can I get a similar thing in Bash?

Objective: build a log_error generic function to call from my (huge) script, outputting severity level of error source, function name and line number.

Intended usage:

log_error "INFO: my info" ... # called from within my_function at line 20

Intended output:

[INFO] my_function@20 my info

Is such a thing possible at all?

3 Answers 3

4

Hope below example with shopt -s expand_aliases and alias could help:

try.sh

#! /usr/bin/env bash

shopt -s expand_aliases

# =============================================================
# Define the logger
# =============================================================
alias logger='logger_function [${BASH_SOURCE##*/}] [$FUNCNAME] [$LINENO] '

logger_function()
{
    echo $@
}

# =============================================================
# Use the logger
# =============================================================
my_function()
{
    logger "hello world!"
}

my_function

Test result in: GNU bash, version 3.2.57(1)-release

$ ./try.sh
[try.sh] [my_function] [20] hello world!

Considering the question is emphasizing on: line number, so in this example, the exactly same input and output of the question are not used.

But to make it more informative, the logging utility definition is added with:

  • $BASH_SOURCE
  • $FUNCNAME
  • $LINENO

So, it can print the file name, function name and line number.

Regarding to alias usage here, it looks like but isn't really comparable to a C macro according to: https://tldp.org/LDP/abs/html/aliases.html

Sign up to request clarification or add additional context in comments.

Comments

2

Use $LINENO: Each time this parameter is referenced, the shell substitutes a decimal number representing the current sequential line number (starting with 1) within a script or function.

Comments

1

You are better off using the BASH_LINENO array. Here is the extract from Bash Manual:

BASH_LINENO An array variable whose members are the line numbers in source files where each corresponding member of FUNCNAME was invoked. ${BASH_LINENO[$i]} is the line number in the source file (${BASH_SOURCE[$i+1]}) where ${FUNCNAME[$i]} was called (or ${BASH_LINENO[$i-1]} if referenced within another shell function). Use LINENO to obtain the current line number.

Here is a comprehensive logging implementation for Bash:

https://github.com/codeforester/base/blob/master/lib/stdlib.sh

1 Comment

Great, thanks. So "${BASH_SOURCE[1]}${BASH_LINENO[0]}" means "parent source file and line number".

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.