파이썬의 logging 모듈을 사용하여 로그 파일을 일자별로 생성하려면, TimedRotatingFileHandler를 사용하는 것이 좋습니다. 이 핸들러는 지정된 간격에 따라 로그 파일을 새로 만들고, 이전 로그 파일의 이름 뒤에 타임스탬프를 붙여 구분합니다. 일자별 로그 파일 생성을 위한 사용자 정의 로깅 클래스 예시는 다음과 같습니다.
import logging
from logging.handlers import TimedRotatingFileHandler
import os
class DailyLogger:
def __init__(self, name, log_dir='logs', level=logging.DEBUG):
# 로그 파일 디렉터리 확인 및 생성
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 로그 파일 경로 설정
log_file_path = os.path.join(log_dir, f"{name}.log")
# 로거 생성 및 레벨 설정
self.logger = logging.getLogger(name)
self.logger.setLevel(level)
# 일자별로 로그 파일을 생성하는 핸들러 설정
file_handler = TimedRotatingFileHandler(log_file_path, when="midnight", interval=1, backupCount=7)
file_handler.setLevel(level)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# 핸들러를 로거에 추가
self.logger.addHandler(file_handler)
def get_logger(self):
"""
구성된 로거 객체 반환
"""
return self.logger
이 클래스는 로그 파일을 매일 자정에 새로 생성하도록 설정됩니다. backupCount=7은 로그 파일을 최대 7개까지 보관하고, 이를 초과하면 가장 오래된 파일부터 삭제한다는 것을 의미합니다. 로그 디렉터리는 생성자에서 log_dir 인자를 통해 지정할 수 있으며, 기본값은 현재 작업 디렉터리 내의 logs 폴더입니다.
사용 예시는 다음과 같습니다:
# DailyLogger 인스턴스 생성 및 로거 가져오기
daily_logger = DailyLogger(name='MyDailyLogger', log_dir='my_logs', level=logging.INFO).get_logger()
# 로깅 메시지 기록
daily_logger.info('정보 메시지입니다.')
이 코드를 실행하면, my_logs 디렉터리 내에 MyDailyLogger.log 파일이 생성되고, 매일 자정마다 새로운 로그 파일로 전환됩니다. 파일 이름은 자동으로 날짜가 추가되어 구분됩니다.
파이썬에서 로깅(logging)은 애플리케이션의 실행 상태에 대한 정보를 기록하는 중요한 기능입니다. logging 모듈을 사용하면 콘솔, 파일, 웹 서버 등 다양한 대상에 로그를 출력할 수 있습니다. 사용자 정의 로깅 클래스를 만드는 기본적인 예시입니다.
먼저, 파이썬의 logging 모듈을 사용하여 로거(logger), 핸들러(handler), 포매터(formatter)를 설정하는 사용자 정의 클래스를 만듭니다. 이 클래스는 로깅을 쉽게 설정하고 사용할 수 있도록 도와줍니다.
import logging
class MyLogger:
def __init__(self, name, level=logging.DEBUG, file_name='app.log'):
# 로거 생성
self.logger = logging.getLogger(name)
self.logger.setLevel(level) # 로그 레벨 설정
# 파일 핸들러 생성 및 설정
file_handler = logging.FileHandler(file_name)
file_handler.setLevel(level)
# 콘솔 핸들러 생성 및 설정
console_handler = logging.StreamHandler()
console_handler.setLevel(level)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러를 로거에 추가
self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler)
def get_logger(self):
"""
구성된 로거 객체 반환
"""
return self.logger
이 클래스를 사용하여 로깅을 설정하고 메시지를 기록하는 방법은 다음과 같습니다:
# MyLogger 인스턴스 생성
my_logger = MyLogger(name='MyAppLogger', level=logging.INFO).get_logger()
# 로깅 메시지 기록
my_logger.debug('디버그 메시지입니다.')
my_logger.info('정보 메시지입니다.')
my_logger.warning('경고 메시지입니다.')
my_logger.error('에러 메시지입니다.')
my_logger.critical('치명적인 에러 메시지입니다.')
이 코드는 MyAppLogger라는 이름의 로거를 생성하고, 로그 메시지를 파일(app.log)과 콘솔에 출력합니다. 로그 메시지에는 발생 시간, 로거 이름, 로그 레벨, 메시지가 포함됩니다.
로깅 레벨은 다음과 같은 순서로 정의됩니다: DEBUG < INFO < WARNING < ERROR < CRITICAL. level 파라미터를 통해 설정한 레벨 이상의 메시지만 출력됩니다. 위 예시에서는 level=logging.INFO로 설정했기 때문에, debug 메시지는 출력되지 않습니다.
logging 모듈을 사용하여 로그를 파일과 콘솔에 동시에 출력하는 방법은 다음과 같습니다:
먼저, logging 모듈을 임포트합니다
import logging
로깅을 설정합니다. 이는 로그 파일의 경로, 로그 레벨, 출력 형식 등을 지정하는 것입니다. 예를 들어, 다음과 같이 설정할 수 있습니다
# 기본 로거 생성
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 파일 핸들러 추가 (파일로 로그를 기록)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
# 콘솔 핸들러 추가 (콘솔에 로그를 출력)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(console_handler)
이제 로그 메시지를 출력할 수 있습니다. 예를 들어
logger.debug('이것은 디버그 메시지입니다.')
logger.info('이것은 정보 메시지입니다.')
logger.warning('이것은 경고 메시지입니다.')
logger.error('이것은 에러 메시지입니다.')
logger.critical('이것은 심각한 에러 메시지입니다.')
위 코드에서는 기본 로거를 생성하고, 파일 핸들러와 콘솔 핸들러를 추가하여 로그를 파일과 콘솔에 동시에 출력합니다. 로그 포맷과 로그 레벨은 각 핸들러에서 설정됩니다.
이렇게 하면 로그가 파일과 콘솔에 동시에 출력되어 프로그램의 디버깅 및 모니터링에 도움이 됩니다.
3. 로깅을 설정하는 별도의 모듈을 만들고 전체 프로젝트에서 사용하는 방법
모든 파이썬 파일에 로깅 파일 핸들러와 콘솔 핸들러를 적용하는 가장 효과적인 방법은 로깅을 설정하는 별도의 모듈을 만들고, 이를 모든 파이썬 파일에서 임포트하여 사용하는 것입니다. 이를 위해서는 다음과 같은 단계를 따릅니다:
로깅 설정을 포함하는 logger.py와 같은 파일을 생성합니다
import logging
# 기본 로거 생성
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 파일 핸들러 추가 (파일로 로그를 기록)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
# 콘솔 핸들러 추가 (콘솔에 로그를 출력)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(console_handler)
이제 logger.py를 프로젝트의 다른 모든 파이썬 파일에서 임포트하여 사용합니다. 예를 들어, 다른 파이썬 파일에서 로깅을 사용할 때 다음과 같이 logger.py를 임포트합니다
from logger import logger
# 로그 메시지 출력
logger.debug('이것은 디버그 메시지입니다.')
logger.info('이것은 정보 메시지입니다.')
logger.warning('이것은 경고 메시지입니다.')
logger.error('이것은 에러 메시지입니다.')
logger.critical('이것은 심각한 에러 메시지입니다.')
이렇게 하면 모든 파이썬 파일에서 같은 로깅 설정을 사용할 수 있으며, 코드의 중복을 피할 수 있습니다. 또한 로깅 설정을 한 곳에서 관리하기 때문에 유지보수가 용이해집니다.
logger LEVEL을 외부에서 바꾸기
로그 레벨을 외부에서 변경할 수 있도록 하려면 로깅 설정을 변경할 수 있는 함수를 만들어야 합니다. 이 함수를 호출하여 로그 레벨을 변경할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다.
logger.py
import logging
# 기본 로거 생성
logger = logging.getLogger()
# 파일 핸들러 추가 (파일로 로그를 기록)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
# 콘솔 핸들러 추가 (콘솔에 로그를 출력)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(console_handler)
def set_log_level(level):
logger.setLevel(level)
file_handler.setLevel(level)
console_handler.setLevel(level)
이제 set_log_level() 함수를 사용하여 로그 레벨을 변경할 수 있습니다. 예를 들어, 다음과 같이 호출할 수 있습니다.
import logging
from logger import set_log_level, logger
# 로그 레벨을 변경합니다.
set_log_level(logging.INFO)
# 로그 메시지 출력
logger.debug('디버그 메시지는 출력되지 않습니다.')
logger.info('이것은 정보 메시지입니다.')
위 코드에서는 로그 레벨을 INFO로 설정하고 있으므로 DEBUG 레벨의 로그는 출력되지 않습니다. set_log_level 함수를 호출하여 로그 레벨을 변경하면 로그 레벨이 변경됩니다.
$ pip install streamlit
Defaulting to user installation because normal site-packages is not writeable
Collecting streamlit
Downloading streamlit-1.10.0-py2.py3-none-any.whl (9.1 MB)
|████████████████████████████████| 9.1 MB 24.5 MB/s
... <생략>
Successfully installed altair-4.1.0 blinker-1.5 commonmark-0.9.1 gitdb-4.0.9 \
gitpython-3.1.18 pyarrow-6.0.1 pydeck-0.6.2 pympler-1.0.1 rich-12.6.0 semver-2.13.0 \
smmap-5.0.0 streamlit-1.10.0 toolz-0.12.0 validators-0.20.0 watchdog-2.3.1
2. Streamlit 데모 실행하기
Streamlit이 성공적으로 설치되었다면, Streamlit의 데모를 실행해 볼 수 있습니다. 이는 Streamlit이 제대로 설치되었는지 확인하는 데에도 도움이 됩니다. 다음 명령어를 통해 Streamlit의 Hello World 데모를 실행할 수 있습니다.
$ streamlit hello
Welcome to Streamlit. Check out our demo in your browser.
Network URL: http://<Private IP>:8501
Ready to create your own Python apps super quickly?
Head over to https://docs.streamlit.io
May you create awesome apps!
이 명령어를 실행하면, 기본 웹 브라우저가 자동으로 열리고 Streamlit의 환영 메시지가 담긴 페이지로 이동합니다. 이 페이지에서는 Streamlit의 다양한 기능을 소개하는 예제들을 확인하고 직접 실행해 볼 수 있습니다.
3. 자신만의 Streamlit 앱 만들기
Streamlit으로 자신만의 앱을 만들기 위해서는 간단한 Python 스크립트를 작성해야 합니다. 예를 들어, 다음과 같은 코드를 app.py라는 파일에 작성해 보세요.
import streamlit as st
st.title('나의 첫 Streamlit 앱')
st.write('Streamlit은 정말 멋져요!')
그리고 나서, 터미널에서 다음과 같이 이 스크립트를 실행합니다.
$ streamlit run app.py
2024-03-13 14:08:43.872 Did not auto detect external IP.
Please go to https://docs.streamlit.io/ for debugging hints.
You can now view your Streamlit app in your browser.
Network URL: http://<Private IP>:8501
이 명령어를 실행하면, 웹 브라우저가 열리고 당신이 작성한 Streamlit 앱을 볼 수 있습니다. 이제부터는 원하는 대로 코드를 수정하고, 데이터를 시각화하고, 사용자 입력을 받는 등 다양한 기능을 추가하여 앱을 개발할 수 있습니다.
마무리
Streamlit을 사용하면 복잡한 웹 프레임워크 없이도 Python만으로 데이터 애플리케이션을 빠르게 구축할 수 있습니다. 이제 기본적인 설치와 데모 실행 방법을 알게 되었으니, 다양한 프로젝트에 활용해 보겠습니다.
gabriel@NB-15052600:~$ sudo apt install python3-virtualenv
[sudo] password for gabriel:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
javascript-common libjs-jquery libjs-sphinxdoc libjs-underscore libpython3-dev libpython3.10-dev
python3-dev python3-distlib python3-distutils python3-filelock python3-lib2to3 python3-pip python3-pip-whl
python3-platformdirs python3-setuptools python3-setuptools-whl python3-wheel python3-wheel-whl
python3.10-dev
Suggested packages:
apache2 | lighttpd | httpd python-setuptools-doc python2-pip-whl python2-setuptools-whl
The following NEW packages will be installed:
javascript-common libjs-jquery libjs-sphinxdoc libjs-underscore libpython3-dev libpython3.10-dev
python3-dev python3-distlib python3-distutils python3-filelock python3-lib2to3 python3-pip python3-pip-whl
python3-platformdirs python3-setuptools python3-setuptools-whl python3-virtualenv python3-wheel
python3-wheel-whl python3.10-dev
0 upgraded, 20 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.6 MB of archives.
After this operation, 37.7 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 javascript-common all 11+nmu1 [5936 B]
Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjs-jquery all 3.6.0+dfsg+~3.5.13-1 [321 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjs-underscore all 1.13.2~dfsg-2 [118 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy/main amd64 libjs-sphinxdoc all 4.3.2-1 [139 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libpython3.10-dev amd64 3.10.6-1~22.04.2ubuntuPreparing to unpack .../19-python3-virtualenv_20.13.0+ds-2_all.deb ...
Unpacking python3-virtualenv (20.13.0+ds-2) ...
Setting up javascript-common (11+nmu1) ...
Setting up python3-setuptools-whl (59.6.0-1.2ubuntu0.22.04.1) ...
Setting up python3-filelock (3.6.0-1) ...
Setting up python3-pip-whl (22.0.2+dfsg-1ubuntu0.2) ...
Setting up python3-distlib (0.3.4-1) ...
Setting up python3-platformdirs (2.5.1-1) ...
Setting up libpython3.10-dev:amd64 (3.10.6-1~22.04.2ubuntu1) ...
Setting up python3.10-dev (3.10.6-1~22.04.2ubuntu1) ...
Setting up libjs-jquery (3.6.0+dfsg+~3.5.13-1) ...
Setting up python3-lib2to3 (3.10.6-1~22.04) ...
Setting up python3-wheel-whl (0.37.1-2ubuntu0.22.04.1) ...
Setting up libjs-underscore (1.13.2~dfsg-2) ...
Setting up python3-distutils (3.10.6-1~22.04) ...
Setting up libpython3-dev:amd64 (3.10.6-1~22.04) ...
Setting up python3-setuptools (59.6.0-1.2ubuntu0.22.04.1) ...
Setting up python3-wheel (0.37.1-2ubuntu0.22.04.1) ...
Setting up python3-pip (22.0.2+dfsg-1ubuntu0.2) ...
Setting up libjs-sphinxdoc (4.3.2-1) ...
Setting up python3-virtualenv (20.13.0+ds-2) ...
Setting up python3-dev (3.10.6-1~22.04) ...
Processing triggers for man-db (2.10.2-1) ...
gabriel@NB-15052600:~$
설치된 버전 확인
gabriel@NB-15052600:~$ virtualenv --version
virtualenv 20.23.0 from /home/gabriel/.local/lib/python3.11/site-packages/virtualenv/__init__.py
gabriel@NB-15052600:~$
pip를통해서 virtualenv를 설치
pip 로 설치했는데 virtualenv가 실행안되서 위의 apt로 추가로 설치했어요.
gabriel@NB-15052600:~$ python -m pip install --user virtualenv
Collecting virtualenv
Downloading virtualenv-20.23.0-py3-none-any.whl (3.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 9.7 MB/s eta 0:00:00
Collecting distlib<1,>=0.3.6
Downloading distlib-0.3.6-py2.py3-none-any.whl (468 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 468.5/468.5 kB 9.1 MB/s eta 0:00:00
Collecting filelock<4,>=3.11
Downloading filelock-3.12.0-py3-none-any.whl (10 kB)
Collecting platformdirs<4,>=3.2
Downloading platformdirs-3.5.1-py3-none-any.whl (15 kB)
Installing collected packages: distlib, platformdirs, filelock, virtualenv
WARNING: The script virtualenv is installed in '/home/gabriel/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed distlib-0.3.6 filelock-3.12.0 platformdirs-3.5.1 virtualenv-20.23.0
[notice] A new release of pip available: 22.3.1 -> 23.1.2
[notice] To update, run: pip install --upgrade pip
gabriel@NB-15052600:~$
virtualenv 가상환경 생성
virtualenv <환경이름> --python=<파이썬버전>
$ virtualenv auto --python=python3.11
virtualenv <환경이름> --python=<파이썬 설치경로>
$ virtualenv auto --python=/home/gabriel/.pyenv/shims/python
gabriel@NB-15052600:~/virtualenv$ ll
total 12
drwxr-xr-x 3 gabriel gabriel 4096 May 19 12:46 ./
drwxr-x--- 6 gabriel gabriel 4096 May 19 12:39 ../
drwxr-xr-x 4 gabriel gabriel 4096 May 19 12:46 auto/
gabriel@NB-15052600:~/virtualenv$ cd auto/
gabriel@NB-15052600:~/virtualenv/auto$ ll
total 24
drwxr-xr-x 4 gabriel gabriel 4096 May 19 12:46 ./
drwxr-xr-x 3 gabriel gabriel 4096 May 19 12:46 ../
-rw-r--r-- 1 gabriel gabriel 40 May 19 12:46 .gitignore
drwxr-xr-x 2 gabriel gabriel 4096 May 19 12:46 bin/
drwxr-xr-x 3 gabriel gabriel 4096 May 19 12:46 lib/
-rw-r--r-- 1 gabriel gabriel 337 May 19 12:46 pyvenv.cfg
gabriel@NB-15052600:~/virtualenv/auto$ source ./bin/activate
(auto) gabriel@NB-15052600:~/virtualenv/auto$ python -V
Python 3.11.3
(auto) gabriel@NB-15052600:~/virtualenv/auto$ which python
/home/gabriel/virtualenv/autogpt/bin/python
(auto) gabriel@NB-15052600:~/virtualenv/auto$
(auto) gabriel@NB-15052600:~/virtualenv/auto$ pip list
Package Version
---------- -------
pip 22.0.2
setuptools 59.6.0
wheel 0.37.1
(auto) gabriel@NB-15052600:~/virtualenv/auto$ pwd
/home/gabriel/virtualenv/auto
(auto) gabriel@NB-15052600:~/virtualenv/auto$ deactivate
gabriel@NB-15052600:~/virtualenv/auto$
Visual Studio Code 설치 및 WSL 연동
vscode에서 Remote Explorer에 Default 를 WSL Target > Ubuntu 로 default distro를 지정한다. (기존 아마 docker)
Ubuntu 22.04 LTS에는 python3가 설치되어있다. pip, venv는 설치되어 있지 않음
gabriel@NB-15052600:~$ python -V
Command 'python' not found, did you mean:
command 'python3' from deb python3
command 'python' from deb python-is-python3
gabriel@NB-15052600:~$ python3 -V
Python 3.10.6
gabriel@NB-15052600:~$ python3 -m pip
/usr/bin/python3: No module named pip
gabriel@NB-15052600:~$
gabriel@NB-15052600:~$ pyenv install 3.11.3
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
Installing Python-3.11.3...
BUILD FAILED (Ubuntu 22.04 using python-build 2.3.17-10-g920ef145)
Inspect or clean up the working tree at /tmp/python-build.20230515214905.2289
Results logged to /tmp/python-build.20230515214905.2289.log
Last 10 log lines:
checking for pkg-config... no
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... "linux"
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20230515214905.2289/Python-3.11.3':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
gabriel@NB-15052600:~$
PS C:\Users\gabriel> wsl --list --online
다음은 설치할 수 있는 유효한 배포판 목록입니다.
'wsl.exe --install <Distro>'를 사용하여 설치합니다.
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
SUSE-Linux-Enterprise-Server-15-SP4 SUSE Linux Enterprise Server 15 SP4
openSUSE-Leap-15.4 openSUSE Leap 15.4
openSUSE-Tumbleweed openSUSE Tumbleweed
PS C:\Users\gabriel>
설치
PS C:\Users\gabriel> wsl --install -d Ubuntu-20.04
설치 중: Ubuntu 20.04 LTS
Ubuntu 20.04 LTS이(가) 설치되었습니다.
Ubuntu 20.04 LTS을(를) 시작하는 중...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: gabriel
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Mon May 15 19:06:59 KST 2023
System load: 0.52 Users logged in: 0
Usage of /home: unknown IPv4 address for eth1: 172.23.64.1
Memory usage: 47% IPv4 address for eth2: 172.28.0.1
Swap usage: 0% IPv4 address for wifi0: 192.168.0.20
Processes: 8
1 update can be applied immediately.
To see these additional updates run: apt list --upgradable
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
This message is shown once a day. To disable it please create the
/home/gabriel/.hushlogin file.
gabriel@NB-15052600:~$