10 / 10 / 1
Регистрация: 28.11.2013
Сообщений: 153

Настроить log4j2 для логгирования действий в двух классах

09.04.2017, 00:13. Показов 2749. Ответов 1

Студворк — интернет-сервис помощи студентам
Есть два класса JarClassLoader и Menu, действия в которых нужно логгировать через log4j2.

Логгирование работает только в Menu. Пишется и в файл и в консоль.

Никакие сообщения из JarClassLoader никуда не пишутся.

Для простоты отправил в лог по одному сообщению из каждого класса.

Неправильно настроил log4j2? Неправильно вызываю? В чем дело?


log4j2.properties
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
name=PropertiesConfig
property.filename=classloading/menu-module/logs
appenders=console, file
 
appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
 
appender.file.type=File
appender.file.name=LOGFILE
appender.file.fileName=${filename}/propertieslogs.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
 
rootLogger.level=info
rootLogger.appenderRefs=stdout
rootLogger.appenderRef.stdout.ref=STDOUT
 
loggers=file
logger.file.name=com.example.classloading
logger.file.level=info
logger.file.appenderRefs=file
logger.file.appenderRef.file.ref=LOGFILE



JarClassLoader
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.example.classloading;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
public class JarClassLoader extends ClassLoader {
 
    private static final Logger log = LogManager.getLogger(JarClassLoader.class);
 
    private HashMap<String, Class<?>> cache = new HashMap<String, Class<?>>();
    private String jarFileName;
    private String packageName;
    private static String WARNING = "Warning : No jar file found. Packet unmarshalling won't be possible. Please verify your classpath";
 
    public JarClassLoader(String jarFileName, String packageName) {         
        log.info(">> inside JarClassLoader");
 
        this.jarFileName = jarFileName;
        this.packageName = packageName;
 
        cacheClasses();
    }
 
    private void cacheClasses() {
        try {
            JarFile jarFile = new JarFile(jarFileName);
            Enumeration entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry jarEntry = (JarEntry) entries.nextElement();
                // simple class validation based on package name
                if (match(normalize(jarEntry.getName()), packageName)) {
                    byte[] classData = loadClassData(jarFile, jarEntry);
                    if (classData != null) {
                        Class<?> clazz = defineClass(stripClassName(normalize(jarEntry.getName())), classData, 0, classData.length);
                        cache.put(clazz.getName(), clazz);
                        System.out.println("== class " + clazz.getName() + " loaded in cache");
                    }
                }
            }
        }
        catch (IOException IOE) {
            System.out.println(WARNING);
        }
    }
 
    public synchronized Class<?> loadClass(String name) throws ClassNotFoundException {
        Class<?> result = cache.get(name);
        if (result == null)
            result = cache.get(packageName + "." + name);
        if (result == null)
            result = super.findSystemClass(name);    
        System.out.println("== loadClass(" + name + ")");    
        return result;
    }
 
    private String stripClassName(String className) {
        return className.substring(0, className.length() - 6);
    }
 
    private String normalize(String className) {
        return className.replace('/', '.');
    }
 
    private boolean match(String className, String packageName) {
        return className.startsWith(packageName) && className.endsWith(".class");
    }
 
    private byte[] loadClassData(JarFile jarFile, JarEntry jarEntry) throws IOException {
        long size = jarEntry.getSize();
        if (size == -1 || size == 0)
            return null;
 
        byte[] data = new byte[(int)size];
        InputStream in = jarFile.getInputStream(jarEntry);
        in.read(data);
 
        return data;
    }
}


Menu
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.example.classloading;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
import java.util.Scanner;
 
public class Menu {
 
    private static final Logger log = LogManager.getLogger();
 
    public static void main(String[] args) {
 
        int select;
        do {
            log.info(">> menu started");
 
            System.out.println("=== MENU ===");
            System.out.println("This is a simple multi-module project that can dynamically load modules.");
            System.out.println("1. Load and run simple-module");
            System.out.println("2. Load and run module in jar from ...");
            System.out.println("0. EXIT");
 
            Scanner scanner = new Scanner(System.in);
            select = scanner.nextInt();
 
            switch (select) {
                case 1: {
                    JarClassLoader jarClassLoader = new JarClassLoader("classloading/simple-module/target/simple-module-1.0-SNAPSHOT.jar", "com.example.classloading");
                    try {
                        Class<?> clas = jarClassLoader.loadClass("com.example.classloading.SimpleModule");
                        Module sample = (Module) clas.newInstance();
                        sample.run();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                }
                case 2: {
                    System.out.print("    Path to jar: ");
                    String jarFileName = scanner.next();
                    System.out.print("    Package name: ");
                    String packageName = scanner.next();
                    System.out.print("    Class to load and run: ");
                    String classToLoad = scanner.next();
 
                    JarClassLoader jarClassLoader = new JarClassLoader(jarFileName, packageName);
                    try {
                        Class<?> clas = jarClassLoader.loadClass(classToLoad);
                        Module sample = (Module) clas.newInstance();
                        sample.run();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        } while (select != 0);
    }
 
}
Миниатюры
Настроить log4j2 для логгирования действий в двух классах  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2017, 00:13
Ответы с готовыми решениями:

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих имен встречаются во всех классах, какие...

Трассировка для логгирования нескольких потоков в текстовый файл
в MSDN Поясните, как работает эта штука. Мне нужно использовать трассировку для логгирования нескольких потоков в текстовый файл. Нужно...

Настроить ЧПУ 1c bitrix для двух разделов
Добрый день Всем! Подскажите Уважаемые. Как настроить ЧПУ вида: Исходный вид страницы www.ru/products/?filter_SECTION_3=shlyapa на...

1
10 / 10 / 1
Регистрация: 28.11.2013
Сообщений: 153
09.04.2017, 00:47  [ТС]
Все работает, неправильно интерпретировал работу программы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2017, 00:47
Помогаю со студенческими работами здесь

Как настроить Analytics для двух доменов
Добрый день! Очень нужна помощь тех, кто &quot;гуру&quot; в Гугл Аналитиксе. Что имеем: - два сайта: www.site.ru и инет магаз...

Настроить маршруты для двух одновременно работающих сетей
Здравствуйте. Имеется две подключенные сети к ubuntu 14.04. eth0 и eth1 Соответственно eth1 ходит в интернет через прокси с...

Как настроить grub для загрузки двух систем?
Привет Всем. Такая проблема: короче говоря установил совместо с Windows 7 Ubuntu. Все ок. Убунту работает нормально, НО! Windows 7 при...

Как настроить доступ к игровому серверу CS 1.6 для двух локальных сетей
Добрый день, есть 2 локальные сети соединенные как показано на схеме. Задача создать 1 сервер CS 1.6 только для двух локальных сетей....

Сравнение двух полей в разных классах
У меня есть класс &quot;Кассир&quot; и класс &quot;Продукт&quot;. В классе &quot;Кассир&quot; есть метод который добавляет в покупку товар по штрих коду. Вот метод: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru