精华内容
下载资源
问答
  • 手机的唯一识别符
    2017-08-14 22:13:02

    • 串号 IMEI
    • 蓝牙地址
    • 无线地址 MAC
    • 序列号 sn
    • sim卡电话卡
    • 安卓开发的时候千万不要用它们校验唯一性,你会被开除的,有个傻鸟就因为这个被开除了,搞了一堆Bug,有框架,有框架,有框架(重要的事说三遍)。
    更多相关内容
  • 行业文档-设计装置-提供移动台唯一临时识别符的方法.zip
  • 希望应用中能有设备特定的全球唯一识别码。试过这样的代码,但是运行后是生成了新的UUID。 CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault); NSString *uuidStr = ( NSString *)CFUUIDCreateString...
  • 行业分类-设备装置-使用数据相依性电路路径响应的唯一且不可仿制的平台识别符
  • iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示。好景不长,因为该唯一标识符与手机一一对应,苹果...
  • 设备唯一标识

    千次阅读 2020-10-30 14:34:53
    International Mobile Equipment Identity,国际移动设备身份码,在手机组装完成后赋予的一个全球唯一的号码,由于此时IPhone只支持单卡,所以IMEI和IPhone是一一对应的 iOS 2提供了一种方法获取IMEI,但是为了保护...

    一、IMEI

    International Mobile Equipment Identity,国际移动设备身份码,在手机组装完成后赋予的一个全球唯一的号码,由于此时IPhone只支持单卡,所以IMEI和IPhone是一一对应的

    iOS 2提供了一种方法获取IMEI,但是为了保护用户隐私,iOS 5以后苹果不再允许获取IMEI了,如果你在应用中获取IMEI,可能会遭到Apple Store的拒绝

    二、IDFA

    Identifier for Identifier,即广告标识符,多用于用户的广告追踪,是每台设备的唯一ID,IDFA存储在用户的系统上

    Apple是不允许开发者追踪用户设备的,但是为了监控广告效果,在 iOS 6中提供这个折中方案,但IDFA也会发生变化,比如重置系统、还原广告标识符等

    同时,用户也可以选择是否禁止广告追踪(即商家没办法根据用户的行为偏好推送广告)

    三、UDID

    Unique Device Identifier,即设备唯一标识,在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI

    1. 用于一些统计与分析目的;第三方统计工具如友盟,广告商如ADMOB等

    2. 将UDID作为用户ID来识别唯一用户,省去用户名、密码等注册过程

    3. UDID被弃用可以使用UUID来作为设备的唯一标识

      获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了

      使用keychain存储可以保证程序卸载重装时,UUID不变

      但当刷机或者升级系统后,UUID还是会改变的

    四、Mac 地址

    Medium/Media Access Control,网络设备的物理地址,如果IMEI被认为是设备的唯一标识,那么Mac就是网络接口唯一标识

    学过计算机网络都知道,在根据IP进行物理寻址的时候就是使用的Mac地址

    同样由于隐私问题,在iOS 7之后无法通过Mac地址来标识唯一设备,因为在iOS 7之后获取到的Mac地址为一固定值

    五、NSUUID

    Universally Unique IDentifier,即通用唯一识别码,UUID是一个软件建构的标准,也是被开源软件基金会(Open Software Foundation,OSF)的组织在分布式计算环境(Distributed Computing Environment,DCE)领域的一部分

    UUID的目的,是让分布式系统中的所有元素都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定

    根据以上定义可知,同一设备上的不同应用的UUID是互斥的,即能在改设备上标识应用;但是并没有明确指出能标识出装有同一应用的不同设备,据推测,这个UUID应该是根据设备标识和应用标识生成唯一标识,再经过加密而来的

    NSUUID与之前的CFUUID是一致的,只是改成了Objective-C的接口而已,NSUUID每次获取的值都会发生变化,但是它会保持唯一性

    UIDevice.current.identifierForVendor?.uuidString

    六、IDFV

    identifierForVendor,Vendor标示符,也被称为厂商标识符,只要用户的设备中没有卸载当前Vendor的所有APP,则不会发生变化

    什么是Vendor ?可以理解成bundleID的前两部分,例如对于com.joy.app_1和com.joy.app_2这两个bundleID来说,就属于同一个Vendor,共享同一个IDFV

    IDFV比较适合追踪用户行为,目前多配合Keychain来搭配使用,来保证不管是否卸载重装,IDFV都是不变的

    NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    七、LC_UUID

    其实这个和Device ID没什么关系,但是因为也叫UUID,防止造成误解,所以来解释下

    LC_UUID可以这么理解,是用来标示Mach-O的,如果去查看你APP的崩溃日志,你会发现应用的可执行程序和各种库都有自己的UUID,你在进行符号解析的时候,就需要找到与系统库和你APP的UUID相同的符号文件来进行堆栈地址还原

    八、结论

    想要通过UDID、Mac地址、OpenUDID来定位用户设备已经是不可能了,因为它们要么是无效,要么是受到了App Store的限制;但是如果你想要追踪广告的话,可以使用IDFA,想要用来分析用户行为可以使用IDFV + KeyChain来解决

    展开全文
  • Android10.0和11.0唯一识别标识设计

    千次阅读 2021-01-22 18:52:02
    应用开发中不管是埋点统计还是推送通知,都会用到唯一识别标识,在Android中设备唯一码有很多,如:MAC地址、IMEI号(DeviceId)、IMSI号、ANDROID_ID、序列号(SerialNumber)等,但并不是所有设备上都能稳定获取到...

    背景介绍

    应用开发中不管是埋点统计还是推送通知,都会用到唯一识别标识,在Android中设备唯一码有很多,如:MAC地址、IMEI号(DeviceId)、IMSI号、ANDROID_ID、序列号(SerialNumber)等,但并不是所有设备上都能稳定获取到这些值。

    在10.0以前这些值还能获取到,Mac地址6.0之后通过api是获取不到的,通过扫描硬件端口还能获取,但是10.0之后,这些唯一识别标识都被Android官方禁用了,Mac地址会返回一个虚假的值。

    谷歌在禁用上文所述的唯一识别码后,还给了一个唯一识别码的最佳做法,原文链接:https://developer.android.com/training/articles/user-data-ids

    使用 Android 标识符的最佳做法

    在使用 Android 标识符时,请遵循以下最佳做法:

    1. 避免使用硬件标识符。在大多数用例中,您可以避免使用硬件标识符,例如 SSAID (Android ID),而不会限制所需的功能。

      Android 10(API 级别 29)对不可重置的标识符(包括 IMEI 和序列号)添加了限制。您的应用必须是设备或个人资料所有者应用,具有特殊运营商权限或具有 READ_PRIVILEGED_PHONE_STATE 特许权限,才能访问这些标识符。

    2. 只针对用户剖析或广告用例使用广告 ID。在使用广告 ID 时,请始终遵循用户关于广告跟踪的选择。此外,请确保标识符无法关联到个人身份信息 (PII),并避免桥接广告 ID 重置。

    3. 尽一切可能针对防欺诈支付和电话以外的所有其他用例使用实例 ID 或私密存储的 GUID。对于绝大多数非广告用例,使用实例 ID 或 GUID 应已足够。

    4. 使用适合您的用例的 API 以尽量降低隐私权风险。使用 DRM API 保护重要内容,并使用 SafetyNet API 防止滥用行为。SafetyNet API 是能够确定设备真伪而不会招致隐私权风险的最简单方法。

    原文中推荐使用

    • 使用广告 ID

    • 使用实例 ID 和 GUID

    广告ID暂不考虑,这里其实主要是使用GUID,什么是GUID呢?

    其实GUID就是JDK中的UUID,使用代码如下:

    String uniqueID = UUID.randomUUID().toString();
    

    唯一识别标识存储设计

    既然官方推荐使用JDK的UUID来做唯一识别码,剩下的工作就是如何存储这个UUID了。我的设计是使用SharedPreferences结合本地外部存储文件存储UUID

    SharedPreferences的作用是当应用没有被卸载的时候,如果外部存储中的文件被删除了,启动应用的时候会创建新文件,并将SharedPreferences中的UUID写入文件;

    外部存储的UUID文件首先设置成隐藏文件,存储在外部存储中,应用卸载后不会被删除,作用是当应用卸载后再次安装的时候,会去找这个隐藏文件,如果存在这个文件,就把UUID读出来,然后赋值给SharedPreferences

    最后还要判断文件中的UUID是否被篡改了,若被篡改了就以SharedPreferences为主,并将SharedPreferences的UUID同步更新到文件中。

    本来还想使用联系人的系统数据库进行存储,能够兼容7.0一下的设备,这一块如果需要可以自己实现。从SharedPreferences、本地文件、系统数据库三方面考虑,保证UUID不被破坏。

    源码如下:

    public class GuidUtil {
    
        private static final String GUID_KEY = "guid";
    
        private static final String uuidFileName = ".app-guid";
        private static final String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + uuidFileName;
    
        public static String createGUID(Context context) throws Exception {
            // 读取顺序,sp file
            String guid = getFromSP(context);
            if (guid != null) {
                return guid;
            }
            guid = getFromFile();
            if (guid != null) {
                // 如果能够从文件中获取,表示应用卸载了,需要重新给SP赋值
                setToSP(context, guid);
                return guid;
            }
            // 前面三个都没有数据,表示第一次安装,需要生成一个UUID
            guid = UUID.randomUUID().toString().replace("-", "");
            // 将UUID保存到SP、外部存储目录
            setToSP(context, guid);
            setToFile(guid);
            return guid;
        }
    
        /**
         * 从SharedPreferences中读取UUID
         */
        private static String getFromSP(Context context) throws Exception {
            String guid = SPUtil.getString(context, GUID_KEY, "");
            if (!TextUtils.isEmpty(guid)) {
                // sp中有值,更新一下系统数据库和外置存储文件
                updateFile(guid);
                return guid;
            }
            return null;
        }
    
    
        /**
         * 从文件读取UUID
         */
        private static String getFromFile() throws Exception {
            File file = new File(filePath);
            if (!file.exists()) {
                return null;
            }
            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
            // 读取一行即可
            return bufferedReader.readLine();
        }
    
    
        /**
         * 检测外部存储目录是否有该UUID,没有则更新,没有表示文件被用户清除了
         */
        private static void updateFile(String guid) throws Exception {
            File file = new File(filePath);
            // 如果文件不存在,则表示被清理了,
            if (!file.exists()) {
                file.createNewFile();
                writeData(guid);
            } else {
                // 如果文件存在,则需要对比一下sp中和文件中的是否一致
                String fileUUID = getFromFile();
                // 如果不相等,则表示被篡改了,需要更新
                if (!guid.equals(fileUUID)) {
                    setToFile(guid);
                }
            }
        }
    
        /**
         * 保存到sp
         */
        private static void setToSP(Context context, String guid) {
            SPUtil.putString(context, GUID_KEY, guid);
        }
    
        /**
         * 保存到文件
         */
        private static void setToFile(String guid) throws Exception {
            File file = new File(filePath);
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            writeData(guid);
        }
    
        /**
         * 将UUID写入文件
         */
        private static void writeData(String guid) throws Exception {
            FileOutputStream fos = new FileOutputStream(filePath);
            fos.write(guid.getBytes());
            fos.close();
        }
    
    }
    

    有个SPUtil就不贴代码了,可以到源码里去找。

    源码地址:https://github.com/RenZhongrui/android-learn/tree/master/026-android-uuid

    设计优缺点

    • 谷歌推荐使用,10.0以后只能这么设计了,10.0之前的可以使用Mac地址、AndroidId等;

    • 如果设备恢复出厂设置了,那么应用和文件都会被清理,不过一般也没人会恢复出厂设置;

    • UUID也可以做一下加解密,可以更安全一些;

    • 酷狗音乐也是使用的这种方式,有图有真相;

    在这里插入图片描述

    兼容Android11.0(重要补充)

    上面的方案支持10.0和10.0以下是没有问题的,10.0的设备需要添加过渡方案(targetSdkVersion= 29),在AndroidManifest.xml添加android:requestLegacyExternalStorage="true",如下所示:

    <application
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true">
    </application>
    

    但是过渡方案毕竟是过渡,到了Android11.0,如果targetSdkVersion变更为30,谷歌就会强制执行分区存储,什么是分区存储?

    官网介绍:https://developer.android.com/about/versions/11/privacy/storage?hl=zh-cn

    分区存储主要体现在以下几点:

    • Android Q文件存储机制修改成了沙盒模式;
    • APP只能访问自己目录下的文件(可以使用File Api操作)和公共媒体文件(使用MediaStore操作);
    • 对于AndroidQ以下,还是使用老的文件存储方式(可以使用File Api操作);

    所以到了Android11,过渡方案将不可行,GUID存储文件必须存储到应用自己的沙盒中或者公共媒体文件中,其他目录将无权限访问。

    为了一劳永逸,干脆撇去过渡方案,直接兼容Android11,修改了一下方案:

    • GUID存储到SharedPreferences中;
    • 10.0以下,GUID存储到外部存储隐藏文件中;
    • 10.0和11.0,GUID存储到媒体图片中,也就是Pictures中,当然文件会以图片的形式存储到该目录下。在这里插入图片描述

    代码这里就别贴了,源码地址:https://github.com/RenZhongrui/android-learn/tree/master/026-android-uuid

    了解MediaStore

    媒体操作示例:https://developer.android.com/training/data-storage/shared/media?hl=zh-cn

    公有目录下的文件不会跟随APP卸载而删除,媒体API操作:

    在这里插入图片描述

    这里主要说一下10.0和11.0使用MediaStore遇到的一些坑:

    1、DownloadsPictures权限问题

    一开始想使用Downloads来创建文本存储,但是Downloads有个权限问题,Downloads无法读取和修改别的应用创建的非媒体文件,

    那自己创建的文件应该可以修改吧,然后把应用卸载之后,再安装,会发现使用query查询出来的Uri为null,最后导致的是每次卸载应用再启动,都会创建一个新文件,如下图所示:
    在这里插入图片描述

    后来试了一下Pictures媒体,是可以读取别的应用创建的文件。

    2、Pictures删除文件

    首先,Pictures媒体,是可以读取别的应用创建的文件,但是不能删除别的应用创建的文件,这里别的应用包括同一个应用卸载后安装后会变成新的应用的情况。

    然后,存到Pictures媒体中,文件格式只能是图片格式,如果存储文本格式会报错,另外如果文件名称没有添加后缀的话,系统会默认添加.jpg的后缀,所以最好自己添加一个后缀。

    最后,如果手动去Pictures目录中删除文件,再次去创建文件的时候会创建不成功;存储到Pictures媒体中,会以图片的形式显示到相册中,如果从相册中删除图片,则再次创建的时候不会出现问题。

    3、应用只能删除自己创建的文件,没有权限删除别的应用创建的文件,包括卸载又安装,卸载前和重新安装后的应用不是一个应用。

    4、非自己创建的文件,查询时添加参数无效,返回Cursor为null

    ContentResolver resolver = context.getContentResolver();
    // 设置入参
    String[] projection = new String[]{
        MediaStore.Images.Media._ID
    };
    // where 占位符
    String selection = MediaStore.Images.Media.DISPLAY_NAME + "=?";
    // 匹配占位符参数
    String[] args = new String[]{
        GUID_FILE_NAME
    };
    // 查询所有数据
    Cursor query = resolver.query(external, projection, selection, args, null);
    

    5、媒体中不允许创建隐藏文件,也就是只有后缀没有名称的文件,如.guid,如果要创建的文件没有名称,系统会自动以下划线为名称,如:_.guid

    查询文献:

    AndroidQ(10)分区存储完美适配方法:https://www.yht7.com/news/13427

    这篇文章所说的方法不可靠:https://www.jianshu.com/p/477c7b5d58e3?utm_campaign=hugo

    郭霖的文章:https://blog.csdn.net/guolin_blog/article/details/105419420

    Android 媒体操作Demo:https://developer.android.com/training/data-storage/shared/media?hl=zh-cn

    展开全文
  • 基于logback添加唯一追踪ID

    万次阅读 2018-07-11 18:12:19
    1、添加过滤器LogbackFilterpackage com.myself.ssmTest.web.filter; import org.slf4j.MDC; import javax.servlet.*; import java.io.IOException; import java.util.UUID; ...public class...

    1、添加过滤器LogbackFilter

    package com.myself.ssmTest.web.filter;
    
    import org.slf4j.MDC;
    
    import javax.servlet.*;
    import java.io.IOException;
    import java.util.UUID;
    
    /**
     * 增加输出日志traceRootId
     */
    public class LogbackFilter implements Filter {
    
    	private static final String UNIQUE_ID = "traceRootId";
    
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,
    						 FilterChain chain) throws IOException, ServletException {
    		boolean bInsertMDC = insertMDC();
    		try {
    			chain.doFilter(request, response);
    		} finally {
    			if(bInsertMDC) {
    				MDC.remove(UNIQUE_ID);
    			}
    		}
    	}
    
    	private boolean insertMDC() {
    		UUID uuid = UUID.randomUUID();
    		String uniqueId = UNIQUE_ID +"-"+ uuid.toString().replace("-", "");
    		MDC.put(UNIQUE_ID, uniqueId);
    		return true;
    	}
    
    	@Override
    	public void destroy() {
    
    	}
    
    }
    

    2、在src\main\webapp\WEB-INF\web.xml文件的加上过滤器的配置

      <filter>
        <filter-name>logbackFilter</filter-name>
        <filter-class>com.yz.rainbowbridgewebcenter.filter.LogbackFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>logbackFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

    3、在logback.xml文件中的每一个<appender>标签下的<encoder><pattern>中都加上traceRootId,

    我的配置文件是这么添加的(红色字体):<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>,全部 如配置下图(仅供参考):

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--文件资源的引用-->
        <property resource="app.properties"/>
        <!-- 默认输出文件 -->
        <appender name="DEFAULT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/default/common-default.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- 默认错误文件 -->
        <appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/error/common-error.log.%d{yyyyMMdd}</fileNamePattern>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
        </appender>
        <!-- 性能日志文件 -->
        <appender name="PERF-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/perf/common-perf.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- 默认dao日志文件 -->
        <appender name="DAO-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/dao/common-dao.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- service日志文件 -->
        <appender name="SERVICE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/service/common-service.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- 业务日志文件 -->
        <appender name="BUSINESS-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/business/common-business.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- WEB日志文件 -->
        <appender name="WEB-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/web/common-web.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- 报警日志 -->
        <appender name="ALARM-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/alarm/common-alarm.log.%d{yyyyMMdd}</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d [%t] %-5p %c{2} [%X{traceRootId}] - [%m]%n</pattern>
            </encoder>
        </appender>
        <!--默认追踪日志-一般model或工具类日志用此  -->
        <appender name="TRACE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.home}/trace/tracing.log.%d{yyyy-MM-dd-HH}.gz</fileNamePattern>
                <maxHistory>72</maxHistory>
            </rollingPolicy>
            <encoder charset="UTF-8">
                <pattern>%d - [%m]%n</pattern>
            </encoder>
        </appender>
        <!-- ===================================================================== -->
        <!-- Loggers                                                               -->
        <!-- ===================================================================== -->
        <logger name="com.myself.ssmTest.controller" additivity="false">
            <level value="${log.root.level}"/>
            <appender-ref ref="WEB-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
            <logger name="com.myself.ssmTest.service" additivity="false">
            <level value="${log.root.level}"/>
            <appender-ref ref="SERVICE-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
         <logger name="com.myself.ssmTest.dao" additivity="false">
            <level value="${log.root.level}"/>
            <appender-ref ref="DAO-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
         <logger name="com.myself.ssmTest.model" additivity="false">
            <level value="INFO"/>
            <appender-ref ref="TRACE-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
         <logger name="businessLogger" additivity="false">
            <level value="${log.root.level}"/>
            <appender-ref ref="BUSINESS-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
        <logger name="com.tuan.core.common.aop.pref.PerformanceMonitorInterceptor" additivity="false">
        	<level value="INFO"/>
        	<appender-ref ref="PERF-APPENDER"/>
        </logger>
       
        <logger name="java.sql" additivity="false">
            <level value="${log.root.level}"/>
            <appender-ref ref="DAO-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
        
        <logger name="alarmLogger" additivity="false">
            <level value="${log.root.level}"/>
            <appender-ref ref="ALARM-APPENDER"/>
            <appender-ref ref="ERROR-APPENDER"/>
        </logger>
        <!-- 屏蔽logger-start -->
        <logger name="org.springframework" level="${log.root.level}"/>
        <logger name="org.apache" level="WARN"/>
        <logger name="org.mybatis.spring" level="${log.root.level}"/>
        <!-- 屏蔽jdk日志 -->
        <logger name="java" level="WARN"/>
        <logger name="com.mchange" additivity="false">
            <level value="WARN"/>
            <appender-ref ref="DAO-APPENDER"/>
        </logger>
        <!-- 屏蔽logger-end-->
        <root level="${log.root.level}">
            <appender-ref ref="DEFAULT-APPENDER"></appender-ref>
            <appender-ref ref="ERROR-APPENDER"></appender-ref>
        </root>
    </configuration> 

    相关文章:
    logback的搭建与使用-maven项目:https://blog.csdn.net/qq_25646191/article/details/81004513


    展开全文
  • 各种获取设备唯一标识的方法介绍一.UDID(Unique Device Identifier)UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备...
  • 如何生成通用唯一识别码UUID

    千次阅读 2020-03-26 10:10:36
    UUID是128位的全局唯一标识符,通常由32字节的字符串表示。 它通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性。 UUID主要有五个算法,也就是五种方法来实现: uuid1()——基于...
  • 我想通过html5页面获取手机唯一标识码(IMEI),使用什么插件能实现,求大神指点
  • Arduino Nano自制开发板的常见问题:设备描述无法识别、无法烧录Bootloader、无法上电等常见问题汇总。
  • Android设备获取唯一识别

    千次阅读 2016-09-20 14:25:53
    综合以上所述,为了实现在设备上更通用的获取设备唯一标识,我们可以实现这样的一个类,为每个设备产生唯一的UUID,以ANDROID_ID为基础,在获取失败时以TelephonyManager.getDeviceId()为备选方法,如果再失败,使用...
  • * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi); * 2, IMEI(imei); * 3, 序列号(sn); ...
  • java.utils.UUID获取唯一识别

    千次阅读 2019-05-23 14:28:22
    UUID (Universally Unique Identifier)缩写,即通用唯一识别码,也是被开源软件基金会 (Open Software Foundation, OSF)的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。...
  • Android设备唯一标识符(适配Android Q) 目录 Android设备唯一标识符(适配Android Q) 一、需求场景 二、Android设备信息 1、DeviceId(IMEI) 2、AndroidId ...三、唯一识别符方案 1、设计原则...
  • 成功转型为一个iOS工程师,在客户端开发的路上越走越远这次遇到的问题是,上线的iOS版本仿制被刷稍微入行的都知道现在iOS是拿不到手机唯一识别符 网上介绍友盟的openuuid+IDFA 这样的方法,但很明显这个方法现在也...
  • 获取CPU 硬盘 网卡的唯一标识,测试可用,上一个版本有错误,这个版本已经测试可用,可以用来进行软件与硬件之间的绑定
  • android之获取设备唯一标识符

    千次阅读 2019-09-02 09:09:40
    1、随便记录,有很多时候我们都是需要使用当前android机器设备的固定的标志,安卓也并没有能够百分百或得每台设备固定不变的唯一 标志 2、由于权限变更,刷机,重载安装等,将使得标识符失去唯一性,在此背景下,...
  • 互联网广告投放,目前技术已经成熟,大部分的技术架构都相似。 而移动端,作为新的互联网渠道,广告投放也纷纷趋向...目前,移动端使用的用户唯一标示很多: android有android id和device id iphone的UDID、openUDID和
  • 终端识别符取得

    2016-01-04 14:35:55
    终端识别符的取得
  • 摘要:人脸检测与识别是机器视觉领域最热门的研究方向之一,本文详细介绍博主自主设计的一款基于深度学习的人脸识别与管理系统。博文给出人脸识别实现原理的同时,给出Python的人脸识别实现代码以及PyQt设计的UI界面...
  • 本篇博客实现一个编译原理的词法分析器,能够识别用户自定义标识符、常数、字符串、关键字、界。 词法分析包括:用户自定义标识符、常数、字符串、关键字、界识别。用户自定义符号,顾名思义就是自己定义的...
  • 车架号是车辆中使用的唯一编号,通过识别它可以快速找出车辆型号和制造商。 传统的字符识别方法存在特征提取复杂的问题,而卷积神经网络在处理二维图像方面具有独特的优势。 分析了卷积神经网络与传统神经网络相比...
  • 该项目的目标是学习用于形状识别的通用描述。 为此,我们使用卷积神经网络(CNN)训练用于形状识别的判别模型,其中基于视图的形状表示是唯一提示。 示例包括线条画,去除颜色的剪贴画图像或几乎没有纹理信息的3D...
  • 今天在app服务端接口文档中看到2个接口名称,是和idfa相关的,就搜索了解了一下,顺便梳理了ios各种设备识别码。 *IDFA英文全称Identifier+for+Advertising,即广告标示,目前是苹果生态内广告交易的主要标示,...
  • inklink:图像识别工具

    2021-05-10 22:54:45
    图像识别工具 ## Setup为创建帐户在server/ ,创建keys.js并将您的CraftAR api_key添加到module.exports中。 您可能还想手动添加collection或item uuid,以进行测试。 运行npm install来安装依赖项 ## Run运行节点...
  • iOS开发:唯一标志

    2016-07-04 21:52:27
    2、作为用户ID来唯一识别用户,可以用游客身份使用app又能在服务器端保存相应的信息,省去用户名、密码等注册过程。 二、各种唯一标识符介绍 1、UDID UDID是Unique Device Identifier的缩写,中文意思是设备唯一...
  • 获取设备唯一识别符   第一步:获取设备 Mac 地址,并转化为传统的 Mac 地址格式;   第二步:进行散列 hash 处理,即进行 MD5 信息加密,目的是用户个人隐私数据不能进行明文传播; 第三步:返回设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,065
精华内容 39,626
关键字:

唯一识别符