feat: add logger

This commit is contained in:
Sergey Krylov 2026-02-17 05:51:47 +03:00
parent 9b040ba885
commit 59b435b27b
8 changed files with 98 additions and 2 deletions

BIN
lib/slf4j-api-2.0.17.jar Normal file

Binary file not shown.

BIN
lib/slf4j-simple-2.0.17.jar Normal file

Binary file not shown.

View File

@ -0,0 +1,15 @@
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="en">
<head>
<title>Charm Unexpected Error</title>
<%@ include file="style.html" %>
</head>
<body>
<%@ include file="header.jsp" %>
<div>
<h3 style="color: red">500 - ${requestScope.wordBundle.getWord("unexpected-error")}</h3>
</div>
<%@ include file="footer.jsp" %>
</body>
</html>

View File

@ -29,4 +29,8 @@
<error-code>400</error-code> <error-code>400</error-code>
<location>/WEB-INF/jsp/error400.jsp</location> <location>/WEB-INF/jsp/error400.jsp</location>
</error-page> </error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/error.jsp</location>
</error-page>
</web-app> </web-app>

View File

@ -0,0 +1,7 @@
org.slf4j.simpleLogger.defaultLogLevel=info
org.slf4j.simpleLogger.showDateTime=true
org.slf4j.simpleLogger.dateTimeFormat=dd-MM-yyyy HH:mm:ss:SSS
org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.levelInBrackets=true
org.slf4j.simpleLogger.showLogName=true
org.slf4j.simpleLogger.showShortLogName=false

View File

@ -5,6 +5,9 @@ import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.charm.back.controller.filter.ErrorFilter;
import ru.charm.back.dto.ProfileGetDto; import ru.charm.back.dto.ProfileGetDto;
import ru.charm.back.dto.ProfileUpdateDto; import ru.charm.back.dto.ProfileUpdateDto;
import ru.charm.back.mapper.RequestToProfileUpdateDtoMapper; import ru.charm.back.mapper.RequestToProfileUpdateDtoMapper;
@ -23,6 +26,7 @@ import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
public class EmailController extends HttpServlet { public class EmailController extends HttpServlet {
private final ProfileService service = ProfileService.getInstance(); private final ProfileService service = ProfileService.getInstance();
private final RequestToProfileUpdateDtoMapper requestToProfileUpdateDtoMapper = RequestToProfileUpdateDtoMapper.getInstance(); private final RequestToProfileUpdateDtoMapper requestToProfileUpdateDtoMapper = RequestToProfileUpdateDtoMapper.getInstance();
public static final Logger logger = LoggerFactory.getLogger(EmailController.class);
@Override @Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
@ -44,6 +48,7 @@ public class EmailController extends HttpServlet {
ProfileUpdateDto dto = requestToProfileUpdateDtoMapper.map(req, new ProfileUpdateDto()); ProfileUpdateDto dto = requestToProfileUpdateDtoMapper.map(req, new ProfileUpdateDto());
try { try {
service.update(dto); service.update(dto);
logger.info("Email {} was changed in profile with id = {}", dto.getEmail(), dto.getId());
resp.sendRedirect(String.format("/profile?id=%s", dto.getId())); resp.sendRedirect(String.format("/profile?id=%s", dto.getId()));
} catch (DuplicateEmailException e) { } catch (DuplicateEmailException e) {
resp.sendError(SC_BAD_REQUEST); resp.sendError(SC_BAD_REQUEST);

View File

@ -5,15 +5,47 @@ import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.charm.back.dto.ProfileGetDto; import ru.charm.back.dto.ProfileGetDto;
import ru.charm.back.dto.RegistrationDto;
import ru.charm.back.mapper.RequestToRegistrationDtoMapper;
import ru.charm.back.service.ProfileService;
import java.io.IOException; import java.io.IOException;
@WebServlet("/registration") @WebServlet("/registration")
public class RegistrationController extends HttpServlet { public class RegistrationController extends HttpServlet {
private final ProfileService service = ProfileService.getInstance();
private final RequestToRegistrationDtoMapper requestToRegistrationDtoMapper = RequestToRegistrationDtoMapper.getInstance();
public static final Logger logger = LoggerFactory.getLogger(RegistrationController.class);
@Override @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("profile", new ProfileGetDto()); req.getRequestDispatcher("/WEB-INF/jsp/registration.jsp").forward(req, resp);
req.getRequestDispatcher("/WEB-INF/jsp/profile.jsp").forward(req, resp); }
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
RegistrationDto dto = requestToRegistrationDtoMapper.map(req);
Long id = service.save(dto);
logger.info("Profile with the email address {} has been registered with id {}", dto.getEmail(), id);
resp.sendRedirect(String.format("/profile?id=%s", id));
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String sId = req.getParameter("id");
boolean success = false;
if (!sId.isBlank()) {
success = service.delete(Long.parseLong(sId));
}
resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
if (success) {
logger.info("Profile with id {} has been deleted", sId);
}
resp.sendRedirect("/registration");
} }
} }

View File

@ -0,0 +1,33 @@
package ru.charm.back.controller.filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import static jakarta.servlet.RequestDispatcher.ERROR_EXCEPTION;
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.ERROR)
public class ErrorFilter implements Filter {
public static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class);
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
Throwable trowable = (Throwable) req.getAttribute(ERROR_EXCEPTION);
if (res.getStatus() >= 500) {
logger.error("Error 500", trowable);
} else {
logger.warn("Exception code {}", res.getStatus());
}
filterChain.doFilter(servletRequest, servletResponse);
}
}