From adad1a7439d6868610d446022c33146fbf51db73 Mon Sep 17 00:00:00 2001 From: Bichanskiy Date: Mon, 27 Oct 2025 23:37:26 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 8196 bytes task01/.DS_Store | Bin 0 -> 6148 bytes task01/src/.DS_Store | Bin 0 -> 6148 bytes task01/src/com/.DS_Store | Bin 0 -> 6148 bytes task01/src/com/example/.DS_Store | Bin 0 -> 6148 bytes task01/src/com/example/task01/Logger.java | 129 ++++++++++++++++ task02/.DS_Store | Bin 0 -> 6148 bytes task02/src/.DS_Store | Bin 0 -> 6148 bytes task02/src/com/.DS_Store | Bin 0 -> 6148 bytes task02/src/com/example/.DS_Store | Bin 0 -> 6148 bytes .../src/com/example/task02/DiscountBill.java | 25 ++++ task03/.DS_Store | Bin 0 -> 6148 bytes task03/src/.DS_Store | Bin 0 -> 6148 bytes task03/src/com/.DS_Store | Bin 0 -> 6148 bytes task03/src/com/example/task03/Hours.java | 26 ++++ .../src/com/example/task03/Milliseconds.java | 9 +- task03/src/com/example/task03/Minutes.java | 19 ++- task03/src/com/example/task03/Seconds.java | 7 +- task03/src/com/example/task03/TimeUnit.java | 2 + .../src/com/example/task03/TimeUnitUtils.java | 8 + .../com/example/task04/ConsoleHandler.java | 7 + .../src/com/example/task04/FileHandler.java | 20 +++ task04/src/com/example/task04/Logger.java | 141 ++++++++++++++++++ .../src/com/example/task04/MemoryHandler.java | 30 ++++ .../com/example/task04/MessageHandler.java | 5 + .../example/task04/RotationFIleHandler.java | 35 +++++ 26 files changed, 452 insertions(+), 11 deletions(-) create mode 100644 .DS_Store create mode 100644 task01/.DS_Store create mode 100644 task01/src/.DS_Store create mode 100644 task01/src/com/.DS_Store create mode 100644 task01/src/com/example/.DS_Store create mode 100644 task01/src/com/example/task01/Logger.java create mode 100644 task02/.DS_Store create mode 100644 task02/src/.DS_Store create mode 100644 task02/src/com/.DS_Store create mode 100644 task02/src/com/example/.DS_Store create mode 100644 task02/src/com/example/task02/DiscountBill.java create mode 100644 task03/.DS_Store create mode 100644 task03/src/.DS_Store create mode 100644 task03/src/com/.DS_Store create mode 100644 task03/src/com/example/task03/Hours.java create mode 100644 task04/src/com/example/task04/ConsoleHandler.java create mode 100644 task04/src/com/example/task04/FileHandler.java create mode 100644 task04/src/com/example/task04/Logger.java create mode 100644 task04/src/com/example/task04/MemoryHandler.java create mode 100644 task04/src/com/example/task04/MessageHandler.java create mode 100644 task04/src/com/example/task04/RotationFIleHandler.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..73bef707232bde51108ae8f2f5a849cb803dea88 GIT binary patch literal 8196 zcmeI1Pmj_-7{=dW5lYa=K@%<}O}rB1UvxKKSY!_#yevi!YOu9rZMNHPXt4)E!g>7; zeg&_75&bTn^qD`4vRpHc_33EEK7=DyqMP?3ZOD z3g$=+D&Qybs7WU@B?m1ICcp%k025#WOyD{az??0^+A{C!Uapw{6ZkI)$mfHNBDHUH zsZ~8XP^l#Vw1~qh(3Z;q>9LLWjV`sK2O+c-s;$B-F@(0`xNY+KMweQ(orGC@2s5%U zD-@wd$LHHBokU+N*Gzy3Y!Z;S%WZOLMm`0Z^?N{*=Rx$r4I&pgGVc(j`AY>_M5WbQ ze>3-MF1Ng%OKJ9##e-aSHJgoH1s8h?NzU~-=c>>#9pNm8^a9$XGxBndpE<`}ifKX# zUOt5wGhW-j*!WI`lbpK*p99Y+wWysPsqlSQuA9c^hU+)?Jn-YB)%qa{d&OI&vQ@UK z*1OTiC>3d zvGR^|hgGpE<63<_Z$CL`*xmi!qG8VuI<1D?>posAD%SmnkDeZnPlK~Cy1@A(gn8W3 z9sPb)OZJ)X|7kQ0gD8}Yq-VXalVzi>qc553=nu!v4P?{V!KRyIBk!ASY`Qm)O?L;I zUY3n|O03xM{EsVzg9%)nz@E0&<@*0<`~Lsc2Vf@?U;@{kfG7?}!vRk7^2c8OjOAQw uqr69vA@i16l?9cWj-hHf4qg3Wh_;PX>FFC?YQ+%*Zv-d|Trq)vO5itTAV*FB literal 0 HcmV?d00001 diff --git a/task01/.DS_Store b/task01/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..43167b084d24fdb63c722aae51974f82a637a5dd GIT binary patch literal 6148 zcmeHKOHaZ;5T4~BZHNg6O}LnB;*}t%@ewZ-@!-LWHF{8kloD;MT|z+)grsNvF<$*8 z{vDltU_kJy#LOhK-|p;uyY1J_ZWjPpt?yR>3IJfCOHA2V%rV(7ea2EIl0{@{4F4n) zEiV+_OfCf$Qvvzyvfx1<0tjL9`^hD7h+h6srXJshGdRX*9ZnI;@HoSG{l-W`3|(kV ztP32Mtz?KOM-xYq1m$=10Lp*OBK zy^EkdXcShCMAT~rQM;=Mf#1fI>&qbW#h@noksm9rt2->)vKxisa9G{lFY&Ft?NNyj z_ctpgzP+_G8rjzB`o_Uo;~{*E#Iw=?7_N6^%Ld2rf)(@5Pi{8~MRbRearQWikQ5*V zNP)jq!0bv^{%;?HW+w$mfdy1R?hhPYqGK@8sJ0F))D-|RgJES@mp_h@!wotH6OGt| z#xxaCQ<=G9FipoeH+hc1M5CqyGnWr$W@hGw!qn_IK3D0$9F0_x0;IsS0%_eW$n*dB z=llOOiCUxpDe$ipV41pGui-11vvua>8cegLNzI`Ya@HU6OZ*+3 z+1&_5y?78TGcfx$vojm!ZP>{$#<(*J+Kkm1V+JT<$%Nq>!FALxQqq<(Ajdt#(2s-< zPq-b)e_#O5uFQr^u<=>6bbiOMvhyxQCZfIkEScz2e)T6&n53=N8!weBYwJ~`YSfHd z_d#TC>ZP;9@ut`KbRk6K7jw_Q3`g0ZzIh_z)C=R$R0f2>2wZNi!Z;9_BW7`s$XHh` z7^Yzk>W%rleb8%Kox|>;Y0Z0kt)|uO>@OCkv9-N>bUt{D#<6%-#B=y2rEF*{-~}c+ znHV4E&M-ydNx3L|bF7P+lD{$QA&w z0%j>Nmp}i278(F;jk!XwfN&KGs6x4JF}Us>xC)1LTl?nS5T0$TO({YT3Oz1(E!x`R4_;!e2d_r-pi&bXG#Im`KUOG(ob`o#5?@DW zcDJHdZz3u)F!N1kXOixhu#*7*(HwSa03`r$Pzf^yG@l5qlg>!SMzV-PU!w~#g!{3& z2;!M+4*W(2=-K5Vggfxz2HreB72pcJ7CWdb&sxx%$qq*SZV>D2$DkWW{Xw<*Br@6D z+;17oVrr$fEUx!M?!PNJIqbMA;ON+ZI8Te5W_H;qi2{GmLI7&Kd z)KtTy)7Q10S#SzYpvYY0G% zorRrHguXjoU+Q!au0giU05kBO0h;|#O4R@NzMlVe5*ucK8Tg+Jh+NBSHF0mYx6bU6 vdaXn~MgO@P~k=fekb8qYS(N57$`! literal 0 HcmV?d00001 diff --git a/task01/src/com/example/.DS_Store b/task01/src/com/example/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e11ac2528dfbd78f98878d59f2fc3d27a5e1f38a GIT binary patch literal 6148 zcmeHK!AiqG5S^{nCWz33LXQhxi?%9i@e->Zyc*GiN=5P=DX8}>@do-YV8mqf7 zR^d!EJN_dBw0297K>#T{!u0ylM{$U{@u5Y({#0z3r+vHDZ(%=<(yY;V7o~;r;!?$_ zILpqB|DbX|3$kI_4hC0rb*@w#PR2oa5%uy;b@fOkSr8??fli3JJq)?NjFPU(+iI9} zQ=RLZ3CDHZPPH}~HTPO|xxK$LuFFwtt5KIb+q>hj>#VJB9-MU^W{|IOr*f0Zs%D^Z7%vNLo literal 0 HcmV?d00001 diff --git a/task01/src/com/example/task01/Logger.java b/task01/src/com/example/task01/Logger.java new file mode 100644 index 00000000..461ef89b --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,129 @@ +package com.example.task01; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +public class Logger { + // Константы для сравнения "Важности" + public static final int DEBUG = 0; + public static final int INFO = 1; + public static final int WARNING = 2; + public static final int ERROR = 3; + + private final String name; + private int level = INFO; + private static Map storage = new HashMap<>(); + + private Logger(String name){ + this.name = name; + } + + public String getName(){ + return this.name; + } + + public static Logger getLogger(String name){ + if (storage.containsKey(name)){ + return storage.get(name); + } + else{ + Logger logger = new Logger(name); + storage.put(name, logger); + return logger; + } + } + + public void setLevel(int newLevel){ + if(newLevel >= DEBUG && newLevel <= ERROR){ + this.level = newLevel; + } + } + + public int getLevel(){ + return this.level; + } + + // Преобразование числового уровня в текстовый + private String getLevelName(int level) { + switch (level) { + case DEBUG: return "DEBUG"; + case INFO: return "INFO"; + case WARNING: return "WARNING"; + case ERROR: return "ERROR"; + default: return "UNKNOWN"; + } + } + + // Форматирование полного сообщения согласно заданию + private String formatLogMessage(int level, String message) { + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); + + String date = now.format(dateFormatter); + String time = now.format(timeFormatter); + String levelName = getLevelName(level); + + return String.format("[%s] %s %s %s - %s", levelName, date, time, this.name, message); + } + + // Публичные методы log + public void log(int level, String message) { + if (level >= this.level) { + String formattedMessage = formatLogMessage(level, message); + System.out.println(formattedMessage); + } + } + + public void log(int level, String template, Object... args) { + if (level >= this.level) { + String formattedMessage = formatMessage(template, args); + log(level, formattedMessage); + } + } + + // Вспомогательный метод для форматирования + private String formatMessage(String template, Object... args) { + String result = template; + for (Object arg : args) { + result = result.replaceFirst("\\{\\}", String.valueOf(arg)); + } + return result; + } + + // Простые методы для уровней + public void debug(String message) { + log(DEBUG, message); + } + + public void info(String message) { + log(INFO, message); + } + + public void warning(String message) { + log(WARNING, message); + } + + public void error(String message) { + log(ERROR, message); + } + + // Методы с шаблонами для уровней + public void debug(String template, Object... args) { + log(DEBUG, template, args); + } + + public void info(String template, Object... args) { + log(INFO, template, args); + } + + public void warning(String template, Object... args) { + log(WARNING, template, args); + } + + public void error(String template, Object... args) { + log(ERROR, template, args); + } +} diff --git a/task02/.DS_Store b/task02/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..43167b084d24fdb63c722aae51974f82a637a5dd GIT binary patch literal 6148 zcmeHKOHaZ;5T4~BZHNg6O}LnB;*}t%@ewZ-@!-LWHF{8kloD;MT|z+)grsNvF<$*8 z{vDltU_kJy#LOhK-|p;uyY1J_ZWjPpt?yR>3IJfCOHA2V%rV(7ea2EIl0{@{4F4n) zEiV+_OfCf$Qvvzyvfx1<0tjL9`^hD7h+h6srXJshGdRX*9ZnI;@HoSG{l-W`3|(kV ztP32Mtz?KOM-xYq1m$=10Lp*OBK zy^EkdXcShCMAT~rQM;=Mf#1fI>&qbW#h@noksm9rt2->)vKxisa9G{lFY&Ft?NNyj z_ctpgzP+_G8rjzB`o_Uo;~{*E#Iw=?7_N6^%Ld2rf)(@5Pi{8~MRbRearQWikQ5*V zNP)jq!0bv^{%;?HW+w$mfdy1R?hhPYqGK@8sJ0F))D-|RgJES@mp_h@!wotH6OGt| z#xxaCQ<=G9FipoeH+hc1M5CqyGnWr$W@hGw!qn_IK3D0$9F0_x0;IsS0%_eW$n*dB z=llOOiCUxpDe$ipV41pGui-11vvua>8cegLNzI`Ya@HU6OZ*+3 z+1&_5y?78TGcfx$vojm!ZP>{$#<(*J+Kkm1V+JT<$%Nq>!FALxQqq<(Ajdt#(2s-< zPq-b)e_#O5uFQr^u<=>6bbiOMvhyxQCZfIkEScz2e)T6&n53=N8!weBYwJ~`YSfHd z_d#TC>ZP;9@ut`KbRk6K7jw_Q3`g0ZzIh_z)C=R$R0f2>2wZNi!Z;9_BW7`s$XHh` z7^Yzk>W%rleb8%Kox|>;Y0Z0kt)|uO>@OCkv9-N>bUt{D#<6%-#B=y2rEF*{-~}c+ znHV4E&M-ydNx3L|bF7P+lD{$QA&w z0%j>Nmp}i278(F;jk!XwfN&KGs6x4JF}Us>xC)1LTl?nS5T0$TO({YT3Oz1(E!x`R4_;!e2d_r-pi&bXG#Im`KUOG(ob`o#5?@DW zcDJHdZz3u)F!N1kXOixhu#*7*(HwSa03`r$Pzf^yG@l5qlg>!SMzV-PU!w~#g!{3& z2;!M+4*W(2=-K5Vggfxz2HreB72pcJ7CWdb&sxx%$qq*SZV>D2$DkWW{Xw<*Br@6D z+;17oVrr$fEUx!M?!PNJIqbMA;ON+ZI8Te5W_H;qi2{GmLI7&Kd z)KtTy)7Q10S#SzYpvYY0G% zorRrHguXjoU+Q!au0giU05kBO0h;|#O4R@NzMlVe5*ucK8Tg+Jh+NBSHF0mYx6bU6 vdaXn~MgO@P~k=fekb8qYS(N57$`! literal 0 HcmV?d00001 diff --git a/task02/src/com/example/.DS_Store b/task02/src/com/example/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..14c6f213d607db37cf130b3d2df193fa1a37b44f GIT binary patch literal 6148 zcmeHK%}T>S5T32IrijpkLXQhxi&k6w!Aq=q@M=U4Dm5`hgE3p0)E-J9XMG``#MjZ8 z-K`L+HxVf_F!OC@XOhgfVK)N+qB9J)0BQi>pc0mlb2!QQEg_{TB4&D9xJ9cTrj>FIJYE zC1=^W@gCI3%lvGZcKpE=U7afx2h*`1TtvN5x3+qulFW~i-ascrVGl#DFQX(>qmCLT zVXAXIGvQR7YPVJ&kGFRB8?v?6o;2imf4kX`?bgm@QgznWHxJIbkMUEYUi4do!0%Jb zip43s;-FB|vo}a$mE5C$nlp`MWCoZ4W?)_zu=|^{JTC=t9n1hT@M{dv{vc5aU5mLv zy>+0`EdXK}-CA%=zm1e5ExHzSgE)gCOe&&D6}H6?CLR6K#<>=AgC-q>Z9as3valVB z&`-zvOC1ivHOQ73U3IJfCOHA2V%rV(7ea2EIl0{@{4F4n) zEiV+_OfCf$Qvvzyvfx1<0tjL9`^hD7h+h6srXJshGdRX*9ZnI;@HoSG{l-W`3|(kV ztP32Mtz?KOM-xYq1m$=10Lp*OBK zy^EkdXcShCMAT~rQM;=Mf#1fI>&qbW#h@noksm9rt2->)vKxisa9G{lFY&Ft?NNyj z_ctpgzP+_G8rjzB`o_Uo;~{*E#Iw=?7_N6^%Ld2rf)(@5Pi{8~MRbRearQWikQ5*V zNP)jq!0bv^{%;?HW+w$mfdy1R?hhPYqGK@8sJ0F))D-|RgJES@mp_h@!wotH6OGt| z#xxaCQ<=G9FipoeH+hc1M5CqyGnWr$W@hGw!qn_IK3D0$9F0_x0;IsS0%_eW$n*dB z=llOOiCUxpDe$ipV41pGui-11vvua>8cegLNzI`Ya@HU6OZ*+3 z+1&_5y?78TGcfx$vojm!ZP>{$#<(*J+Kkm1V+JT<$%Nq>!FALxQqq<(Ajdt#(2s-< zPq-b)e_#O5uFQr^u<=>6bbiOMvhyxQCZfIkEScz2e)T6&n53=N8!weBYwJ~`YSfHd z_d#TC>ZP;9@ut`KbRk6K7jw_Q3`g0ZzIh_z)C=R$R0f2>2wZNi!Z;9_BW7`s$XHh` z7^Yzk>W%rleb8%Kox|>;Y0Z0kt)|uO>@OCkv9-N>bUt{D#<6%-#B=y2rEF*{-~}c+ znHV4E&M-ydNx3L|bF7P+lD{$QA&w z0%j>Nmp}i278(F;jk!XwfN&KGs6x4JF}Us>xC)1LTl?nS5T0$TO({YT3Oz1(E!x`R4_;!e2d_r-pi&bXG#Im`KUOG(ob`o#5?@DW zcDJHdZz3u)F!N1kXOixhu#*7*(HwSa03`r$Pzf^yG@l5qlg>!SMzV-PU!w~#g!{3& z2;!M+4*W(2=-K5Vggfxz2HreB72pcJ7CWdb&sxx%$qq*SZV>D2$DkWW{Xw<*Br@6D z+;17oVrr$fEUx!M?!PNJIqbMA;ON+ZI8Te5W_H;qi2{GmLI7&Kd z)KtTy)7Q10S#SzYpvYY0G% zorRrHguXjoU+Q!au0giU05kBO0h;|#O4R@NzMlVe5*ucK8Tg+Jh+NBSHF0mYx6bU6 vdaXn~MgO@P~k=fekb8qYS(N57$`! literal 0 HcmV?d00001 diff --git a/task03/src/com/example/task03/Hours.java b/task03/src/com/example/task03/Hours.java new file mode 100644 index 00000000..fbfb451c --- /dev/null +++ b/task03/src/com/example/task03/Hours.java @@ -0,0 +1,26 @@ +package com.example.task03; + +public class Hours implements TimeUnit{ + private final long amount; + + public Hours(long amount){ + this.amount = amount; + } + + public long toMillis(){ + return amount * 3600000; + } + + public long toSeconds(){ + return amount * 3600; + } + + public long toMinutes(){ + return amount * 60; + } + + public long toHours(){ + return amount; + } + +} diff --git a/task03/src/com/example/task03/Milliseconds.java b/task03/src/com/example/task03/Milliseconds.java index 5115bc7d..5d8857a6 100644 --- a/task03/src/com/example/task03/Milliseconds.java +++ b/task03/src/com/example/task03/Milliseconds.java @@ -18,11 +18,16 @@ public long toMillis() { @Override public long toSeconds() { - return amount / 1000; + return Math.round(amount / 1000.0); } @Override public long toMinutes() { - return amount / 1000 * 60; + return Math.round(amount / 60000.0); } + + public long toHours(){ + return Math.round(amount / (1000.0 * 60 * 60)); + } + } diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..04048806 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -2,26 +2,29 @@ public class Minutes implements TimeUnit { + private final long amount; + public Minutes(long amount) { - // TODO: реализовать - throw new UnsupportedOperationException(); + this.amount = amount; } @Override public long toMillis() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount * 60000; } @Override public long toSeconds() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount * 60; } @Override public long toMinutes() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount; + } + + public long toHours(){ + return Math.round(amount / 60); } + } diff --git a/task03/src/com/example/task03/Seconds.java b/task03/src/com/example/task03/Seconds.java index ce6bc213..b2cdb74f 100644 --- a/task03/src/com/example/task03/Seconds.java +++ b/task03/src/com/example/task03/Seconds.java @@ -23,6 +23,11 @@ public long toSeconds() { @Override public long toMinutes() { - return Math.round(amount / 60); + return Math.round(amount / 60.0); } + + public long toHours(){ + return Math.round(amount/3600); + } + } diff --git a/task03/src/com/example/task03/TimeUnit.java b/task03/src/com/example/task03/TimeUnit.java index 3b123fb8..303a88b4 100644 --- a/task03/src/com/example/task03/TimeUnit.java +++ b/task03/src/com/example/task03/TimeUnit.java @@ -28,4 +28,6 @@ public interface TimeUnit { */ long toMinutes(); + long toHours(); + } diff --git a/task03/src/com/example/task03/TimeUnitUtils.java b/task03/src/com/example/task03/TimeUnitUtils.java index 790f8850..be5344ba 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -24,4 +24,12 @@ public static Milliseconds toMillis(Seconds seconds) { public static Seconds toSeconds(Milliseconds millis) { return new Seconds(millis.toSeconds()); } + + // Из миллисекунд в минуты + public static Minutes millToMinutes(Milliseconds millis){ + return new Minutes(millis.toMinutes()); + } + + // из секунд в минуты + } diff --git a/task04/src/com/example/task04/ConsoleHandler.java b/task04/src/com/example/task04/ConsoleHandler.java new file mode 100644 index 00000000..b2113687 --- /dev/null +++ b/task04/src/com/example/task04/ConsoleHandler.java @@ -0,0 +1,7 @@ +package com.example.task04; + +public class ConsoleHandler implements MessageHandler{ + public void handle(String message){ + System.out.println(message); + } +} diff --git a/task04/src/com/example/task04/FileHandler.java b/task04/src/com/example/task04/FileHandler.java new file mode 100644 index 00000000..1b96d284 --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,20 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; + +public class FileHandler implements MessageHandler { + private String fileName; + + public FileHandler(String fileName) { + this.fileName = fileName; + } + + public void handle(String message) { + try (FileWriter writer = new FileWriter(fileName, true)) { + writer.write(message + "\n"); // добавляем перенос строки + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/task04/src/com/example/task04/Logger.java b/task04/src/com/example/task04/Logger.java new file mode 100644 index 00000000..08d65c7c --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,141 @@ +package com.example.task04; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Logger { + // Константы для сравнения "Важности" + public static final int DEBUG = 0; + public static final int INFO = 1; + public static final int WARNING = 2; + public static final int ERROR = 3; + + private final String name; + private int level = INFO; + private static Map storage = new HashMap<>(); // хранилище логгеров + + private List handlers = new ArrayList<>(); + + private Logger(String name){ + this.name = name; + } + + public String getName(){ + return this.name; + } + + public static Logger getLogger(String name){ + if (storage.containsKey(name)){ + return storage.get(name); + } + else{ + Logger logger = new Logger(name); + storage.put(name, logger); + return logger; + } + } + + public void setLevel(int newLevel){ + if(newLevel >= DEBUG && newLevel <= ERROR){ + this.level = newLevel; + } + } + + public int getLevel(){ + return this.level; + } + + // Преобразование числового уровня в текстовый + private String getLevelName(int level) { + switch (level) { + case DEBUG: return "DEBUG"; + case INFO: return "INFO"; + case WARNING: return "WARNING"; + case ERROR: return "ERROR"; + default: return "UNKNOWN"; + } + } + + // Форматирование полного сообщения согласно заданию + private String formatLogMessage(int level, String message) { + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); + + String date = now.format(dateFormatter); + String time = now.format(timeFormatter); + String levelName = getLevelName(level); + + return String.format("[%s] %s %s %s - %s", levelName, date, time, this.name, message); + } + + // Публичные методы log + public void log(int level, String message) { + if (level >= this.level) { + String formattedMessage = formatLogMessage(level, message); + + for (MessageHandler handler : handlers){ + handler.handle(formattedMessage); + } + } + } + + public void log(int level, String template, Object... args) { + if (level >= this.level) { + String formattedMessage = formatMessage(template, args); + log(level, formattedMessage); + } + } + + // Вспомогательный метод для форматирования + private String formatMessage(String template, Object... args) { + String result = template; + for (Object arg : args) { + result = result.replaceFirst("\\{\\}", String.valueOf(arg)); + } + return result; + } + + // Простые методы для уровней + public void debug(String message) { + log(DEBUG, message); + } + + public void info(String message) { + log(INFO, message); + } + + public void warning(String message) { + log(WARNING, message); + } + + public void error(String message) { + log(ERROR, message); + } + + // Методы с шаблонами для уровней + public void debug(String template, Object... args) { + log(DEBUG, template, args); + } + + public void info(String template, Object... args) { + log(INFO, template, args); + } + + public void warning(String template, Object... args) { + log(WARNING, template, args); + } + + public void error(String template, Object... args) { + log(ERROR, template, args); + } + + public void addHandler(MessageHandler handler){ + handlers.add(handler); + } + +} diff --git a/task04/src/com/example/task04/MemoryHandler.java b/task04/src/com/example/task04/MemoryHandler.java new file mode 100644 index 00000000..199a704d --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,30 @@ +package com.example.task04; + +import java.util.ArrayList; +import java.util.List; + +class MemoryHandler implements MessageHandler { + private List messages = new ArrayList<>(); + private MessageHandler target; + private int maxMessages; + + public MemoryHandler(MessageHandler target, int maxMessages) { + this.target = target; + this.maxMessages = maxMessages; + } + + public void handle(String message) { + messages.add(message); + + if (messages.size() >= maxMessages) { + flush(); // автоматическая отправка при заполнении + } + } + + public void flush() { + for (String message : messages) { + target.handle(message); + } + messages.clear(); // очищаем после отправки + } +} diff --git a/task04/src/com/example/task04/MessageHandler.java b/task04/src/com/example/task04/MessageHandler.java new file mode 100644 index 00000000..b55ac1b8 --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,5 @@ +package com.example.task04; + +public interface MessageHandler { + void handle(String message); +} diff --git a/task04/src/com/example/task04/RotationFIleHandler.java b/task04/src/com/example/task04/RotationFIleHandler.java new file mode 100644 index 00000000..8d411f16 --- /dev/null +++ b/task04/src/com/example/task04/RotationFIleHandler.java @@ -0,0 +1,35 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +class RotationFileHandler implements MessageHandler { + private String fileName; + private String currentFile; + + public RotationFileHandler(String fileName) { + this.fileName = fileName; + this.currentFile = getCurrentFileName(); + } + + private String getCurrentFileName() { + String hour = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH")); + return fileName.replace(".", "_" + hour + "."); + } + + public void handle(String message) { + String newFile = getCurrentFileName(); + if (!newFile.equals(currentFile)) { + currentFile = newFile; // сменили файл при смене часа + } + + try (PrintWriter writer = new PrintWriter(new FileWriter(currentFile, true))) { + writer.println(message); + } catch (IOException e) { + // игнорируем ошибки + } + } +}