Spring boot common logging - spring

I'm very new to the spring boot..
I understood that Spring Boot uses Commons Logging for all internal logging.
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
after adding this into application.properties file, application logs all the output and exceptions in the console..
so I have a requirement to print the logs only when the system throws the error not for the success response..

so I have a requirement to print the logs only when the system throws the error not for the success response..
The implementation of this requirement IMO heavily depends on your system
From the word "response" I understand that you're working with some kind of controller (like in spring mvc). But the controller method is only an entry point to your backend.
What if the controller calls the service that logs something (message logA), then (after logging) it calls another service that again logs something (message logB) and then in turn calls, dao to call the datatbase?
If, say, DB threw an error, the logA and logB messages are already logged and you can't "take that back".
So, in general, you can log that there was an error by explicitly catching the exception in controller and logging the error, or using Controller advice to intercept and log the exceptions "globally".
When you reach the point where you log the message you can log it with severity, say, ERROR and the logging framework will log it as long as its configured to log messages of that level from that logger.

Related

Configure Spring Security to only log the Exception without Stacktrace?

I like to have Spring Security log what's going so
logging.level.org.springframework.security=debug
is enabled.
However, when a user uses bad credentials or is not activated, each time an exception with about fifty lines of (uselesss) Stacktrace is logged.
I'd like to get only the exception
org.springframework.security.authentication.DisabledException: User is disabled
without stacktrace.If the logging level is set to info, there however is no log if there was an logging attempt at all.
Is that possible? - without disabling exceptions at all

Google Cloud Platform Log Viewer logs truncate jsonPayload message for error log

The logs I'm viewing in the Log Viewer are truncating the "message" part of the payload, but the "exception" part of the payload doesn't have a limit and shows the entire stacktrace. These logs are for exceptions caught in my service running in Google Cloud.
The service is built with Spring Boot using SLF4J as a logger factory. I use SLF4J's LoggerFactory to create a logger based on the class where it's invoked and when an exception is caught, I log using the logger's error("Exception thrown processing this message: ${message.data}", exception) where message is of type com.google.pubsub.v1.PubsubMessage and exception is a Throwable of type java.lang.Exception.
I had the same problem.
The only way is to jump to Logs Explore and watch the log.

Guice Jersey slf4j - request id logging

In all of my requests, there is a header (request id) that I want to log, in case of anything - on any log level.
Is there a way to inject this into the sl4fj logging? So that the logger always tried to log the request id, in for example logging an exception, but the request.
Or do I always need to add this as a parameter to the logging?
This is not really related to Guice.
You have in slf4j a concept of MDC (Mapped Diagnostic Context). You can put variables in an MDC. These variables are local to the thread and are added to each log generated by this thread. The typical use case of an MDC is to add in every log the user associated with an HTTP request, or a session-id (ie, your use case).
See http://logback.qos.ch/manual/mdc.html
For a short example, you put a variable in MDC like this:
MDC.put("userId", currentUser);
and you can add in an appender format the variable with:
%X{userId}
Theoretically, it could be possible to implement this feature with Guice by injecting a request-scoped logger, but it's really more costly and less integrated with the logging framework. I didn't advise you to do this kind of things!

How to track JTA transactions

We have JTA transactions(Atomikos) configured using Spring annotations across different places in our application. I need to get trace logs whenever a transaction started and completed.
For example, whenever the below method invoked within a new transaction,
#Transactional
void createAgent() { ... }
I need to log a message saying
Transaction started on AgentFactory::createAgent() ...
Transaction ended on AgentFactory::createAgent() ...
Can you please provide if there is any way to enable trace logging on transactions?
If you set loglevel to DEBUG or TRACE for org.springframework.transaction
you get the log entries you want. May be not in the exact format, but the information is provided.

How to configure spring HandlerExceptionResolver to handle NullPointerException thrown in jsp?

From a jsp is thrown a NullPointerException for example using <% null.toString(); %>
This exception is not handled by the HandlerExceptionResolver, but thrown to the web container(tomcat) and converted into a code 500 error.
How can I configure spring to get that error in my HandlerExceptionResolver ?
Details:
Spring can be configured to handle exceptions thrown inside Controllers, but not exceptions thrown by view.
Of course i can resolve the NullPointerException, but i want to design a solution that will gracefully resolve any possible problem on the web application in order to display a user friendly message to the user.
See the HandlerInterceptor interface instead. You'll want the afterCompletion method. You can then intercept the response and then set the appropriate header information to redirect to a container-configured error web page. You're right that Spring doesn't have this functionality, this is going to have to be specified by the web.xml which determines which codes map to which pages.
I have not worked with this particular bit of the spring framework, but the docs say
"Interface to be implemented by objects than can resolve exceptions thrown during handler mapping or execution, in the typical case to error views. Implementors are typically registered as beans in the application context.
Error views are analogous to the error page JSPs, but can be used with any kind of exception including any checked exception, with potentially fine-granular mappings for specific handlers."
so I'd imagine that given that NullPointer extends RuntimeException the framework isn't designed to catch it. Is there a reason the exception(s) can't be handled in the controller directly?

Resources