1.日志技术

1.1、概述

  • 系统希望能记住某些数据是被谁操作的,比如被谁删除了
  • 想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好
  • 当系统在开发或上线后出现了bug,崩溃了,可以通过日志来分析和定位
  • 用来记录程序运行过程中的信息,并可以进行永久存储。好比生活中的日记

【输出语句的弊端】

  • 信息展示在控制台
  • 不能方便的将其记录到其他的位置
  • 想取消记录的信息需要修改代码才可以完成

【日志技术具备的特点和优势】

  • 可以将系统执行的信息,方便的记录到指定的位置
  • 可以随时以开关的形式控制日记的记录和取消,无需到源代码中去进行修改

1.2、日志技术体系

  • 体系结构

11img_1.png

  • 日志接口:一些规范,提供给日志的实现框架设计的标准
  • 日志框架:一些牛人或者第三方公司已经做好的实现代码,后者直接开业拿去使用

【注意】:因为对Commons Logging 接口不满意,有人就搞了 SLF4J。因为对Log4j的性能不满意,有人就搞了logback,logback是基于slf4j的日志规范实现的框架

  • Logback日志框架
  • Logback日志框架分为以下模块
    • logback-core:该模块为其他两个模块提供基础代码【必须有】
    • logback-classic:完整实现了 slf4j API的模块【必须有】
    • logback-access:模块与 Tomcat 和 Jetty 等 Servlet容器继承,以提供 HTTP 访问日志功能【可选模块,以后接触】

1.3、logback快速入门

  • 目的

    • 使用Logback日志框架,记录系统的运行信息
  • 实现步骤

    1. 导入Logback框架到项目去,在项目下新建文件夹lib,导入Logback的jar包到该文件夹下

    2. 将存放jar文件的lib文件夹添加到项目依赖库中

image-20230810161359997.png

  1. 将Logback的核心配置文件logback.xml直接拷贝到 src 目录下(必须是src下)

  2. 创建Logback框架提供的Logger日志对象,后续使用其方法记录系统的日志信息

    public static final Logger LOGGER = LoggerFactory.getLogger("类名.class");
    
    public class Test {
     //创建Logback的日志对象,代表了日志技术
     public static final Logger LOGGER = LoggerFactory.getLogger("Test.class");
     public static void main(String[] args) {
         try {
             LOGGER.debug("main方法开始执行");
             LOGGER.info("第二行日志,程序开始做除法");
             int a = 10;
             int b = 0;
             LOGGER.trace("a = "+a);
             LOGGER.trace("b = "+b);
    
             System.out.println(a / b);
         } catch (Exception e) {
             e.printStackTrace();
             LOGGER.error("程序出现异常:"+e);
         }
     }
    }
    

1.4、Logback配置详解

对Logback日志框架的控制,都是通过核心配置文件logback.xml来实现的

  • Logback日志输出位置、格式设置

    • 通过logback.xml 中的标签可以设置输出位置
    • 通常可以设置2个日志输出位置:控制台,系统文件
  • 输出到控制台的配置标志

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    
  • 输出到系统文件的配置标志

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    

1.5、Logbak配置详情-日志级别设置

  • 级别
    • ALL 和 OFF 分别是打开及关闭全部日志信息
    • trace < debug < info < warn < error:默认级别是 debug
    • 作用:当在 logback.xml 文件中设置了某种日志级别后,系统将只输出当前级别,以及高于当前级别的日志
<!--

 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
 <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
 -->
 <root level="ALL">
     <appender-ref ref="CONSOLE"/>
     <appender-ref ref="FILE" />
 </root>

2.项目【复制粘贴,看结果写代码】

  • Movie
public class Movie {
    private String name;
    private String actor;
    private double score;
    private Integer time;
    private double price;
    private Integer vote;
    private Date startTime;

    @Override
    public String toString() {
        return "Movie{" +
                "name='" + name + '\'' +
                ", actor='" + actor + '\'' +
                ", score=" + score +
                ", time=" + time +
                ", price=" + price +
                ", vote=" + vote +
                ", startTime=" + startTime +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public Integer getTime() {
        return time;
    }

    public void setTime(Integer time) {
        this.time = time;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Integer getVote() {
        return vote;
    }

    public void setVote(Integer vote) {
        this.vote = vote;
    }

    public Date getStartTime() {
        return startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Movie(String name, String actor, double score, Integer time, double price, Integer vote, Date startTime) {
        this.name = name;
        this.actor = actor;
        this.score = score;
        this.time = time;
        this.price = price;
        this.vote = vote;
        this.startTime = startTime;
    }

    public Movie() {
    }
}
  • User
public class User {
    private String loginName;
    private String pwd;
    private String name;
    private char sex;
    private String phone;
    private double money;

    @Override
    public String toString() {
        return "User{" +
                "loginName='" + loginName + '\'' +
                ", pwd='" + pwd + '\'' +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                ", phone='" + phone + '\'' +
                ", money=" + money +
                '}';
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public User() {
    }

    public User(String loginName, String pwd, String name, char sex, String phone, double money) {
        this.loginName = loginName;
        this.pwd = pwd;
        this.name = name;
        this.sex = sex;
        this.phone = phone;
        this.money = money;
    }
}
  • Customer
public class Customer extends User{
    public Customer() {
    }

    public Customer(String loginName, String pwd, String name, char sex, String phone, double money) {
        super(loginName, pwd, name, sex, phone, money);
    }
}
  • Business
public class Business extends User {
    private String storeName;
    private String storeAdress;

    public Business(String storeName, String storeAdress) {
        this.storeName = storeName;
        this.storeAdress = storeAdress;
    }

    public Business(String loginName, String pwd, String name, char sex, String phone, double money, String storeName, String storeAdress) {
        super(loginName, pwd, name, sex, phone, money);
        this.storeName = storeName;
        this.storeAdress = storeAdress;
    }

    public Business() {
    }

    @Override
    public String toString() {
        return "Business{" +
                "storeName='" + storeName + '\'' +
                ", storeAdress='" + storeAdress + '\'' +
                '}';
    }

    public String getStoreName() {
        return storeName;
    }

    public void setStoreName(String storeName) {
        this.storeName = storeName;
    }

    public String getStoreAdress() {
        return storeAdress;
    }

    public void setStoreAdress(String storeAdress) {
        this.storeAdress = storeAdress;
    }
}
  • SystemManager
public class SystemManager {
    //1.存储些用户给
    public static final List<User> ALL_USERS = new ArrayList<>();
    //2.存储系统全部商家和排片信息
    public static final Map<Business,List<Movie>> ALL_MOVIES = new HashMap<>();

    public static final Scanner input = new Scanner(System.in);

    //日志
    public static final Logger LOGGER = LoggerFactory.getLogger("SystemManager.class");

    //日期格式
    public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //定义当前登录的用户
    public static User loginUser;

    //3.准备一些数据
    static {
        Customer c = new Customer("zlyzly","010302","马浩楠",'男',"15836559567",2000);
        ALL_USERS.add(c);
        Customer c1 = new Customer("cheng","010302","程明辉",'男',"15038915226",200);
        ALL_USERS.add(c1);

        Business b = new Business("linyan","010220","林燕",'女',"3185175867",0,"万达影城","二七广场");
        ALL_USERS.add(b);
        List<Movie> movies = new ArrayList<>();
        ALL_MOVIES.put(b,movies);

        Business b1 = new Business("fanxian","010220","范闲",'男',"1231231231",0,"国际影城","地球");
        ALL_USERS.add(b1);
        List<Movie> movies1 = new ArrayList<>();
        ALL_MOVIES.put(b1,movies1);
    }
    public static void main(String[] args) {
        shouMain();
    }
    //首页面
    public static void shouMain(){
        System.out.println("===========电影系统主页===========");
        while(true){
            System.out.println("请输入您要进行的操作:");
            System.out.println("1.登录(商家,用户)\n2.商家入驻\n3.注册");
            switch(input.nextLine()){
                case "1":
                    //登录
                    login();
                    break;
                case "2":
                    //商家入驻
                    break;
                case "3":
                    //注册
                    break;
                default:
                    System.out.println("输入错误,请重新输入\n");
                    break;
            }
        }
    }
    //登录功能
    public static void login(){
        System.out.println("===========用户登录页面===========");
        while(true){
            System.out.println("请输入您的登录名称:");
            loginUser = getUserByLoginName(input.nextLine());
            if(loginUser==null){
                System.out.println("用户名称不存在,请重新输入");
                continue;
            }
            System.out.println("请输入您的登录密码:");
            if(loginUser.getPwd().equals(input.nextLine())){
                System.out.println("登录成功!\n");
                if(loginUser instanceof Customer){
                    CustomerMenu();
                }else {
                    BusinessMenu();
                }
                break;
            }
            System.out.println("密码错误,请重新输出!\n");
        }
    }
    //根据用户名称查询该用户对象
    public static User getUserByLoginName(String loginName){
        for (User user : ALL_USERS) {
            if(user.getLoginName().equals(loginName)){
                return user;
            }
        }
        return null;
    }
    //用户操作页面
    public static void CustomerMenu(){
        Customer c = (Customer) loginUser;
        System.out.println("===========电影用户界面===========");
        while (true) {
            System.out.println(loginUser.getLoginName()+(loginUser.getSex() == '男'? "先生":"女士")+"欢迎您进入系统");
            System.out.println("请选择您要操作的功能:");
            System.out.println("1、展示全部影片信息功能\n2、根据电影名称查询电影信息\n3、评分功能\n4、购票功能\n5、退出系统");
            switch(input.nextLine()){
                case "1":
                    //展示全部影片信息
                    showALLMovies();
                    break;
                case "2":
                    //根据电影名查询电影信息
                    break;
                case "3":
                    //评分
                    break;
                case "4":
                    //购票
                    buyVote();
                    break;
                case "5":
                    //退出
                    return;
                default:
                    System.out.println("输入错误,请重新输入!\n");
                    break;
            }
        }
    }
    //商家操作页面
    public static void BusinessMenu(){
        while(true){
            System.out.println("===========电影商家界面===========");
            String call = loginUser.getSex()=='男' ? "男士":"女士";
            System.out.println(loginUser.getLoginName()+call+"您好,请选择商家操作的功能");
            System.out.println("1、展示详情\n2、上架电影\n3、下架电影\n4、修改电影\n5、退出");
            System.out.println("请输入您要操作的命令:");
            switch(input.nextLine()){
                case "1":
                    //展示详情
                    showMovies();
                    break;
                case "2":
                    //上架电影
                    try {
                        putawayMovie();
                    } catch (Exception e) {
                        e.printStackTrace();
                        LOGGER.error("日期输入错误");
                    }
                    break;
                case "3":
                    //下架电影
                    riseMovie();
                    break;
                case "4":
                    //修改电影
                    try {
                        updateMovie();
                    } catch (Exception e) {
                        e.printStackTrace();
                        LOGGER.error("日期输入有误!");
                    }
                    break;
                case "5":
                    //退出
                    return;
                default:
                    System.out.println("输入错误,请重新输入!\n");
                    break;
            }
        }
    }
    //显示该店铺下所有电影
    public static void showMovies(){
        System.out.println("===========电影商家详情===========");
        Business b = (Business) loginUser;
        System.out.println("您当前个人信息如下:");
        System.out.println(b.getStoreName()+" 电话:"+b.getPhone()+" 地址:"+b.getStoreAdress()+"\t总营收:"+b.getMoney());
        System.out.println("您的影院排片信息如下:");
        if(ALL_MOVIES.get(b).size() < 1){
            System.out.println("您当前无任何排片信息~\n");
            return;
        }
        System.out.println("\t影片名称\t\t\t主演\t\t\t时长\t\t票价\t\t余票\t\t放映时间");
        for (Movie movie : ALL_MOVIES.get(b)) {
            System.out.println("\t"+movie.getName()+"\t\t"+movie.getActor()+"\t\t"+movie.getTime()+"\t\t"+movie.getPrice()+"\t"+movie.getVote()+"\t\t"+SDF.format(movie.getStartTime()));
        }
    }
    //上架功能
    public static void putawayMovie() throws Exception {
        Business b = (Business) loginUser;
        System.out.println("===========电影上架影片===========");
        Movie movie = new Movie();
        System.out.println("请输入新片名:");
        movie.setName(input.nextLine());
        System.out.println("请输入主演");
        movie.setActor(input.nextLine());
        System.out.println("请输入时长");
        movie.setTime(Integer.valueOf(input.nextLine()));
        System.out.println("请输入票价");
        movie.setPrice(Double.valueOf(input.nextLine()));
        System.out.println("请输入票数");
        movie.setVote(Integer.valueOf(input.nextLine()));
        System.out.println("请输入影片放映时间");
        String time = input.nextLine();
        movie.setStartTime(SDF.parse(time));
        ALL_MOVIES.get(b).add(movie);
        System.out.println("您已经成功上架了电影:"+movie.getName());
    }
    //下架功能
    private static void riseMovie() {
        Business b = (Business) loginUser;
        System.out.println("===========电影下架影片===========");
        if(ALL_MOVIES.get(b).size() == 0 || ALL_MOVIES.get(b) == null){
            System.out.println("还未发布影片,无法下架~");
            return;
        }
        while(true){
            System.out.println("请输入电影名称:");
            Movie movie = getMovieByName(input.nextLine());
            if(movie==null){
                System.out.println("该店铺下并没有这部影片,请重新输入:");
                continue;
            }
            System.out.println(ALL_MOVIES.get(b).remove(movie)? "删除成功!\n":"删除失败!\n");
            break;
        }
    }
    //根据电影名字获取电影
    public static Movie getMovieByName(String movieName){
        Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
        for (Map.Entry<Business, List<Movie>> entry : entries) {
            for (Movie movie : entry.getValue()) {
                if(movie.getName().equals(movieName)){
                    return movie;
                }
            }
        }
        return null;
    }
    //修改电影功能
    public static void updateMovie() throws Exception{
        System.out.println("===========电影商家修改界面===========");
        Movie movie = null;
        Business b = (Business) loginUser;
        System.out.println("===========电影下架影片===========");
        if(ALL_MOVIES.get(b).size() == 0 || ALL_MOVIES.get(b) == null){
            System.out.println("还未发布影片,无法下架~");
            return;
        }
        while(true){
            System.out.println("请输入要修改的电影名称:");
            movie = getMovieByName(input.nextLine());
            if(movie==null){
                System.out.println("该店铺下并没有这部电影,请重新输入");
                continue;
            }
            break;
        }
        while(true){
            System.out.println("请输入要修改的信息:");
            System.out.println("1.影片名称\n2.主演\n3.时长\n4.票价\n5.余票\n6.放映时间\n7.退出");
            switch(input.nextLine()){
                case "1":
                    System.out.println("请输入修改的电影名称:");
                    movie.setName(input.nextLine());
                    break;
                case "2":
                    System.out.println("请输入修改的主演:");
                    movie.setActor(input.nextLine());
                    break;
                case "3":
                    System.out.println("请输入修改的时长:");
                    movie.setTime(Integer.valueOf(input.nextLine()));
                    break;
                case "4":
                    System.out.println("请输入修改的票价:");
                    movie.setPrice(Double.valueOf(input.nextLine()));
                    break;
                case "5":
                    System.out.println("请输入修改的余票:");
                    movie.setVote(Integer.valueOf(input.nextLine()));
                    break;
                case "6":
                    System.out.println("请输入修改的放映时间:");
                    String strTime = input.nextLine();
                    movie.setStartTime(SDF.parse(strTime));
                    break;
                case "7":
                    return;
            }
        }
    }
    //展示所有电影功能
    public static void showALLMovies(){
        System.out.println("===========电影影片详情===========");
        Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
        for (Map.Entry<Business, List<Movie>> entry : entries) {
            System.out.println(entry.getKey().getStoreName()+" 电话:"+entry.getKey().getPhone()+" 地址:"+entry.getKey().getStoreAdress());
            System.out.println("\t影片名称\t\t\t主演\t\t\t时长\t\t票价\t\t余票\t\t放映时间");
            if(entry.getValue()!=null && entry.getValue().size() >= 1){
                for (Movie movie : entry.getValue()) {
                    System.out.println("\t"+movie.getName()+"\t\t"+movie.getActor()+"\t\t"+movie.getTime()+"\t\t"+movie.getPrice()+"\t"+movie.getVote()+"\t\t"+SDF.format(movie.getStartTime()));
                }
            }
        }
    }
    //购票功能
    public static void buyVote(){
        showALLMovies();
        Customer c = (Customer) loginUser;
        while(true){
            System.out.println("请输入要购买的门店:");
            String name = input.nextLine();
            List<Movie> movies = getMoviesByName(name);
            Movie movie = null;
            if(movies==null){
                System.out.println("没有该门店,请重新操作");
                continue;
            }
            System.out.println("请输入您要购买电影的片名:");
            for (Movie movie1 : movies) {
                if (movie1.getName().equals(input.nextLine())) {
                    movie = movie1;
                    break;
                }
            }
            if(movie==null){
                System.out.println("该电影并未上映,请重新操作");
                return;
            }
            System.out.println("请输入您要购买几张:");
            Integer countVote = Integer.valueOf(input.nextLine());
            double money = movie.getPrice() * countVote;
            System.out.println("用户金额:"+c.getMoney()+"支付金额:"+money);
            if(c.getMoney()<money){
                System.out.println("金额不足,请充值!");
                continue;
            }
            if(movie.getVote() < countVote){
                System.out.println("余票不足,请重新操作!");
                continue;
            }
            System.out.println("订票成功!您订购了电影"+movie.getName()+"("+countVote+"张)");
            c.setMoney(money);
            movie.setVote(movie.getVote()-countVote);
            Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
            for (Map.Entry<Business, List<Movie>> entry : entries) {
                if (entry.getValue().contains(movie)) {
                    entry.getKey().setMoney(entry.getKey().getMoney()+money);
                    return;
                }
            }
        }
    }
    //根据名称得到该门店的电影集合
    public static List<Movie> getMoviesByName(String name){
        Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
        for (Map.Entry<Business, List<Movie>> entry : entries) {
            if(entry.getKey().getStoreName().equals(name)){
                return entry.getValue();
            }
        }
        return null;
    }
}

results matching ""

    No results matching ""